2012-10-27 6 views
6

このコードは何を意味していますか?Cでstructの配列の部分的な初期化が行われるとどうなりますか?

struct foo_t { 
    int a; 
    int b; 
} foo[10] = {{0,0}} 

foo [0]は{0,0}ですが、残りはどうなりますか? C標準はこれをどのように扱いますか?

ADDED。私は包括的な答えhereを創設しました。私は自分の質問を削除するべきだと思う。

+0

可能重複[CおよびC++:自動構造の部分初期化(http://stackoverflow.com/questions/10828294/c-and-c-partial-initialization-of-automatic-structure)該当 –

答えて

8

配列全体は、abの両方の値が0の構造体で初期化されます。これは、プリミティブ値と次の場合と同様である:アレイ内のすべての整数を値0で初期化される

int foo[10] = {0}; 

C99標準では以下のように指定します。

集合体の要素またはメンバー があるよりも、中括弧で囲まれたリストで、より少ない初期化子、またはANを初期化するために使用される文字列リテラルで少ない文字がある場合配列に要素があるよりもサイズが既知の配列 の場合、集計の残りの部分は、静的な記憶期間を持つオブジェクトと暗黙的に同じに初期化されます。

+1

+1の引用符は+1です。 –

2

値が0の場合、通常はリストの終わりを意味します。これは、あなたがそのようなリストを繰り返し、あなたがこの価値の玩具に遭遇すると、あなたが終わりに達していることを知っていることを意味します。私は、誰かがこのような広告を彼の心の中に作ったと思う。コードを検索すると、リストに値を追加した後にゼロ値を設定するコードの断片が見つかることがあります。

+0

私の英語のために。しかし、私は構造がどのように初期化されるか*を意味します。私は言語について面白く、著者が上記のコードをどのように使用したいのではない。私は少し質問を編集しました。 –

+0

ここにあります。このような配列は、プログラムのデータ領域にメモリブロックを確保します。コンパイル時のコンパイラはこのメモリを0で初期化します。ローカル変数の場合、グローバルブロックはスタックを初期化するためにスタックにコピーされます。この構造体の配列は連続したメモリブロックを占有するので、すべてのバイトを0に設定すると、実際に配列を初期化することに注意してください。私はあなたに質問に答えてくれることを願っています。 – Gus

関連する問題