6

引数として文字列を期待する関数がたくさんあり、そのためにを使用していchar*ますが、バイト配列を期待するすべての関数も。を使用していますchar*

問題は、nullターミネータが見つからないため、文字列関数でバイト配列を渡すという間違いを簡単に犯して、あらゆる種類のオーバーフローを引き起こす可能性があることです。

これは通常どのように対処しますか?すべてのバイト配列関数を変更してを取得することを想像できますuint8_t。そうすると、文字列を渡すときにコンパイラが符号付きについて警告します。または、ここでの正しいアプローチは何ですか?

4

4 に答える 4

2

私は通常、次のような配列を作成します

typedef struct {
   unsigned char* data;
   unsigned long length;
   unsigned long max_length;
} array_t;

次に、array_t*を渡します

array_t*を取る配列関数を作成します

void array_create( array_t* a, unsgined long length) // allocates memory, sets the max_length, zero length

void array_add(array_t* a, unsigned char byte)  // add a byte

于 2013-02-02T20:49:04.483 に答える
1

問題はあなたが考えているよりもCでより一般的です。char*およびは関数パラメーターと同等であるためchar[]、このようなパラメーターは3つの異なるセマンティック概念を参照する場合があります。

  • 1つのcharオブジェクト上のポインター(これはポインター型の「公式」定義です)
  • char配列_
  • 文字列

可能な場合はほとんどの場合、C標準のmondernインターフェイスはvoid*型指定されていないバイト配列を使用します。おそらくその規則に従いchar*、文字列にのみ使用する必要があります。

char[]それ自体では、おそらくそのように使用されることはめったにありません。これらの多くのユースケースを想像することはできません。それらを数字と考える場合は、signedまたはunsignedバリアントを使用する必要があります。ビットパターンと同じように表示する場合はunsigned char、選択する必要があります。

配列を関数パラメーターとして本当に意味する場合(charまたはそうでない場合)、コードのカジュアルな読者のために、明確に示すことでその事実をマークできます。

void toto(size_t n, char A[const n]);

これは同等です

void toto(size_t n, char *const A);

しかし、あなたの意図をより明確にします。そして将来的には、境界チェックを行うツールもあるかもしれません。

于 2013-02-02T21:37:53.927 に答える
0

文字列とバイトの両方を処理するための共通の構造を記述します。

struct str_or_byte
{
    int type;
    union
    {
        char *buf;
        char *str;
    }pointer;
    int buf_length;
}

文字列でない場合は、までにのみtypeアクセスします。それ以外の場合は、チェックせずに直接アクセスし、nullで終了する文字列として維持します。pointer.bufbuf_lengthpointer.strbuf_length

または、長さのみを考慮して文字列をバイト配列として維持し、文字列のnullで終了する文字を保持しないでください。

struct str_or_byte
{
    char *buf;
    int buf_length;
}

また、長さを考慮しない文字列操作関数は使用しないでください。つまり、、、..の代わりに、、...をstrncpy使用strncatすることを意味します。strncmpstrcpystrcatstrcmp

于 2013-02-02T20:50:21.480 に答える
0

慣例を使用してC。これが私が使用するルールです(std libの後に作られました)

void foo(char* a_string);

void bar(void* a_byte_array, size_t number_of_bytes_in_the_array);   

これは覚えやすいです。単一のchar*ptrを渡す場合、それはnullで終了するchar配列でなければなりません。

于 2013-02-03T04:01:36.037 に答える