明示的な末尾ターミネータを使用する場合と使用しない場合の文字列の初期化

すでにサイズを宣言しているため、2 つの宣言はまったく同じです。ただし、サイズを指定しないと、最初の宣言でより大きな文字列が作成されることがわかります。

char a[] = "a\0";
char b[] = "a";

printf("%i %i\n", sizeof(a), sizeof(b));

版画

3 2

これは、a が 2 つの null (明示的なものと暗黙的なもの) で終わるのに対し、b は暗黙的なものだけで終わるためです。


さて、2 つのケースが次のようであると仮定します (コンパイラ エラーを回避するため):

char str1[32] = "\0";
char str2[32] = "";

人々が述べているように、str1 は 2 つのヌル文字で初期化されます:

char str1[32] = {'\0','\0'};
char str2[32] = {'\0'};

ただし、C および C++ 標準の両方によれば、配列の一部が初期化されると、配列の残りの要素がデフォルトで初期化されます。文字配列の場合、残りの文字はすべてゼロで初期化される (つまり、null 文字) ため、配列は really 次のように初期化:

char str1[32] = {'\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0'};
char str2[32] = {'\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0'};

したがって、最終的には、この 2 つに違いはありません。


他の人が指摘したように、"" は 1 つの終了文字 '\0' を意味するため、実際には "\0" は 2 つの null 文字で配列を初期化します。

他の回答者の中には、これが「同じ」であることを暗示している人もいますが、それは正しくありません。配列が使用される唯一の方法が、最初の文字で始まる C 文字列として配列を参照することである限り、実質的な違いはないかもしれません。ただし、実際には 2 つの異なるメモリ初期化が行われることに注意してください。特に、Str[1] が完全にゼロであるか、初期化されていないか (コンパイラ、OS、およびその他のランダムな要素によっては、何でもかまいません) が異なります。異なる動作をする配列のいくつかの使用法 (おそらく役に立たないかもしれませんが、それでも) があります。