私は次のコードを持っています
int t[] = {
[1] = 45,
[2] = 33
};
t[0]
この場合の価値は何でしょうか?ゴミが入ってる?
他の値は初期化されます。C11標準、§6.7.9初期化、¶19および¶21から:
初期化は、初期化子リストの順序で行われるものとします。特定のサブオブジェクトに提供される各初期化子は、同じサブオブジェクトに対して以前にリストされた初期化子をオーバーライドします。151)明示的に初期化されていないすべてのサブオブジェクトは、静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されるものとします。
151)オーバーライドされ、そのサブオブジェクトの初期化に使用されないサブオブジェクトの初期化子は、まったく評価されない可能性があります。
中括弧で囲まれたリストの初期化子が集合体の要素またはメンバーよりも少ない場合、または既知のサイズの配列を初期化するために使用される文字列リテラルの文字数が配列内の要素よりも少ない場合、集合体の残りの部分は静的な保存期間を持つオブジェクトと同じように暗黙的に初期化されます。
またint
、静的ストレージ期間で初期化されていない場合は、暗黙的にゼロに初期化されます。同じセクション、¶10:
自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不確定です。静的またはスレッドの保存期間を持つオブジェクトが明示的に初期化されていない場合、次のようになります。
- ポインタ型の場合は、nullポインタに初期化されます。
- ポインタ型の場合は、nullポインタに初期化されます。
- 算術型の場合、(正または符号なし)ゼロに初期化されます。
- 集合体の場合、すべてのメンバーはこれらのルールに従って(再帰的に)初期化され、パディングはすべてゼロビットに初期化されます。
- ユニオンの場合、最初に指定されたメンバーはこれらのルールに従って(再帰的に)初期化され、パディングはすべてゼロビットに初期化されます。
動作はC89とC99で同じです。