2017-10-22 7 views
0

私は構造体配列を持っています。初期化する必要があるインデックス位置はわずかです。初期化されていない組み合わせが0に初期化されることを確実にするコンパイラ属性はありますか?例えばグローバル初期化配列の未使用インデックス?

:私は以下のように静的init'd構造体配列を持っている場合、どのように(明示的に事前init'dない)そのアレイ内の残りの3つの要素は、「ゼロであること

確保することができ何か?あなたが欲しい

typedef struct foo_s { 
    int a; 
    int b; 
} foo_t; 

foo_t foo_array[4] = { 
    { .a = 1, .b = 2 }, 
}; 

おかげで、

+4

明示的に初期化されていないものはゼロに初期化されます。これはC言語の一部です。 –

答えて

1

行動には「半初期化」変数はありません、すでに標準Cの一部です。もしあなたが何かの一部だけを初期化するならば、残りの要素はすべてゼロで初期化されます。

さらに、この配列がグローバルであると(あなたのタイトルで)言う。つまり、静的な記憶期間があるため、初期化子をまったく指定しなくてもゼロ初期化されます。

集計初期化子にC99を引用:

6.7.8/19

[...]明示的に初期化されていないすべてのサブオブジェクトが暗黙的に持っているオブジェクトと同じ初期化されなければなりません静的記憶期間。

6.7.8/21

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

6.7.8/10

静的記憶域期間を持つオブジェクトを明示的に初期化されていない場合、 次いで:

  • がポインタ型を有する場合、それはヌルポインタに初期化されます。
  • 算術型の場合は、(正または符号なし)ゼロに初期化されます。
  • 集合体の場合、すべてのメンバーはこれらの規則に従って(再帰的に)初期化されます。
  • 共用体の場合、最初の名前付きメンバはこれらの規則に従って(再帰的に)初期化されます。