次の違いがあるかどうかを知りたいです。
char s[32] = "";
と:
char s[32] = {0};
ありがとう。
いいえ、両方の宣言に違いはありません。
char bla[32] = {0};
and
char bla[32] = "";
C標準の関連する段落を参照してください(強調鉱山):
(C99, 6.7.8p21) 「中括弧で囲まれたリスト内の初期化子の数が集合体の要素またはメンバーよりも少ない場合、または既知のサイズの配列を初期化するために使用される文字列リテラルの文字数が、要素の数よりも少ない場合。配列、集約の残りの部分は、静的な保存期間を持つオブジェクトと同じように暗黙的に初期化されます。」
その場合、違いはなく、どちらも配列のすべてのスロットを 0 に初期化します。一般に、 は配列に対して""
のみ機能しchar
ます ( または のような変更の有無にかかわらずconst
)unsigned
が、{0}
すべての数値型の配列に対して機能します。
標準 (n1570) のセクション 6.7.9 では、ポイント 21 が読み取られます。
集合体の要素またはメンバーよりもブレースで囲まれたリスト内の初期化子が少ない場合、または配列内の要素よりも既知のサイズの配列を初期化するために使用される文字列リテラル内の文字が少ない場合、集合体の残りの部分は静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。
そのため""
、完全な配列を初期化します。
すでに述べたことに加えて:
char s[32] = "";
=
char s[32] = {'\0'};
=
char s[32] = {0};
=
char s[32] = {0, 0, 0, /* ...32 zeroes here*/ ,0 };
これらはすべて、まったく同じマシン コード (すべてゼロで埋められた 32 バイト配列) になります。
両方の式の結果は同じで、空の文字列です。ただし、最初の方がより明示的であるため、より読みやすくなっています。
違いはありません。あなたも自分の目で見ることができます!それがあなたが得ることができる最も信頼できる答えです。デバッガーを使用するだけです。2 つの行を実行し、結果を比較します。ただし、配列の名前を変更する必要があります。gcc/gdb を使用して、次のコードをコンパイルします
int main(int argc, char* argv[])
{
char s[5] = {0};
char t[5] = "";
return 0;
}
gcc -g test.c を介して、gdb a.out を呼び出します。gdbに入力します
break 5
run
print s
最後のステートメントは、次の出力で gdb によって応答されます。
$1 = "\000\000\000\000"
私は続けて「print t」と入力し、それに応じて取得します
$2 = "\000\000\000\000"
これは、私が選んだコンパイラを使用すると、両方のステートメントが同じ結果になることを示しています。