2013-04-22 24 views
7

は、私が見バッファの初期化は、次のように行われます。buffer [100] = {0、}を使用した初期化はどのようにC言語で動作しますか? C言語で書かれたプログラムのロードデータ部に

char buffer[100] = {0, }; 

しかし、私は値がこの文で割り当てられているかについてはよく分かりません。いくつかのアイデアを伝えてください。

これはコンパイラによって異なりますか、それとも言語機能ですか?

そして、何この文と等価である場合、そのゼロの後にコンマを使用するポイントは、次のとおりです。コーダは最初の要素だけがあることを確認するため

char buffer[100] = {0}; 

はそれが、万が一、ですゼロ、残りは気にしない?

+3

各要素の値を確認できませんか? –

+5

ああ、私の馬鹿。しかし、それがコンパイラや何かに依存していたらどうでしょうか? – Cong

+0

Xcode IDE、Apple LLVM compiler 4.2の下で、バッファ[0]からバッファ[255]までのすべての要素に対して、すべて '\ 0'です。 – Cong

答えて

10

これはコンパイラによって異なりますか、それとも言語機能ですか?

動作は言語標準によって指定されます。 (ページ141であるC11§6.7.9初期化/ 21、)現在の標準を使用すると、集計の要素よりも少ない初期化子を供給したときに何が起こるかを説明します。

brace-で少ない初期化子がある場合配列内に要素があるよりも既知のサイズの配列を初期化するために使用される文字列リテラル内の文字数が少なければ、集計の残りは と暗黙的に同じオブジェクトに初期化されます静的記憶期間を有する。

したがって、指定されていない要素は\0に初期化されます。

+0

参考にしていただきありがとうございます:D – Cong

+0

ああ! [C11](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)のセクション6.7.9の初期設定では、構文は明示的に '{ 0、} 'を' {initializer-list、} 'として返します。 – Cong

5

与えられた値(この場合は単一の0)が使用され、他のすべてのメンバーは0で埋められます。

char buffer[100] = {1, };と言っても、配列には1と99のゼロが含まれます。

buffer[100] = {literal, }
+0

これは私が欲しかった良い例! – Cong

4

は両方とも0.RichieHindleのbuffer[100] = {1, }全体を示すに全てelementtsを初期化するようbuffer[100] = {0}に相当する一方buffer[100] = {0} .On 0にリテラル値、残りの最初の要素が0 .Yourコードにすべての要素を初期化する初期化ポイント。

+0

非常に明確な説明。ありがとうございました! – Cong

1

指定されたサイズの配列の初期化子は、配列メンバーに1対1で割り当てられます。すべてのメンバに対して初期化子が少なすぎる場合、残りのメンバは0に初期化されます。指定されたサイズの配列に対して初期化子が多すぎるとエラーになります。

+0

あなたの洞察力を共有していただき、ありがとうございます。 – Cong

関連する問題