unsigned char 配列と char 配列で NULL (または 0 または '\0') はどのように動作しますか? char 配列では、NULL は char 配列の終わりを決定します。unsigned char配列でも同じですか?そうでない場合、unsigned char 配列の末尾をどのように判断できますか?
2 に答える
の正確な定義NULL
は実装定義です。それについて保証されているのは、ヌル ポインター定数に展開されるマクロであるということだけです。同様に、null ポインター定数は、「ゼロに評価される整数型の整数定数式 (5.19) prvalue または型の prvalue std::nullptr_t
」です。char
orに変換できる場合とできない場合がありunsigned char
ます。実際にはポインターでのみ使用する必要があります。
0
int
値がゼロの型のリテラルです。'\0'
ゼロの値を持つ char 型のリテラルです。どちらも に暗黙的に変換可能unsigned char
で、値はゼロになります。
C および C++ の文字列は、多くの場合char
、最初のゼロ値で終わる s のシーケンスとして表されるのは、純粋な規則です。この規則に従わない char 配列を宣言することを妨げるものは何もありません。
char embedded_zero[] = {'a', '\0', 'b'};
もちろん、引数が規則に従うことを期待する関数は、最初のゼロで停止します: strlen(embedded_zero) == 1;
.
もちろん、同様の規則を取り、それに従う関数を作成してunsigned char*
、呼び出し元がゼロ値を持つ要素でシーケンスの終わりを示すことを要求することもできます。または、シーケンスの長さを示す 2 番目のパラメーターを取る関数を作成することもできます。どちらのアプローチが自分の設計に適しているかを決定します。
厳密に言えば、配列'\0'
の末尾ではなく、文字列リテラルの末尾を示しますchar
。たとえば、配列を文字列リテラルに初期化せずに宣言すると、配列には終了マーカーがありません。
unsigned char
ただし、s の配列を文字列リテラルで初期化する'\0'
と、通常の文字配列と同じ終了マーカーが得られます。つまり、以下のコードでは
char s[] = "abc";
unsigned char u[] = "abc";
s[3]
とu[3]
の同一の値が含まれています'\0'
。