すべて:
C 言語の場合:
struct A
{
int a;
int b;
};
A aa = {0};
このステートメントは aa.a のみを初期化するか、構造全体を初期化しますか? または、動作はコンパイラに依存しますか?
前もって感謝します!
One more ex:
struct A
{
int a;
int b;
};
struct A aa = {5};
これにより、構造全体が初期化されますが、aa.b は 0 に初期化されます。構造体の少数のメンバーのみを初期化すると、その他のすべてのメンバーは自動的に 0 に初期化されます。
C99 標準のセクション 6.7.8.17 によると、例では最初のメンバー (宣言順、つまりa
フィールド) のみが明示的に初期化されます。
中括弧で囲まれた各初期化子リストには、現在のオブジェクトが関連付けられています。指定が存在しない場合、現在のオブジェクトのサブオブジェクトは、現在のオブジェクトの型に従って順に初期化されます。配列要素は添字の昇順、構造体メンバーは宣言順、共用体の最初の名前付きメンバーです。
「指定」によって標準的な手段
A aa = {.b = 0};
これは、どのフィールドを初期化するかをプログラマーに決定させるより正確な方法です。
このステートメントは aa.a のみを初期化するか、構造全体を初期化しますか?
以下の例を見てください。構造体を {3} で初期化することは、{3,0} で初期化することに似ています。
したがって、プログラムで {0} で初期化すると、実際には a と b (構造全体) の両方を {0,0} で初期化しています。
#include<stdio.h>
typedef struct A
{
int a;
int b;
}a;
int main()
{
a aa = {3};
printf("\na1 = %d",aa.a);
printf("\nb1 = %d",aa.b);
a bb = {3,0};
printf("\na2 = %d",bb.a);
printf("\nb2 = %d",bb.b);
}
標準(N1570)より
6.7.9 初期化
...
10 自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不確定です。静的またはスレッド ストレージ期間を持つオブジェクトが明示的に初期化されていない
場合: — ポインター型の場合は、null ポインターに初期化されます。
— 算術型の場合、(正または符号なし) ゼロに初期化されます。
— 集合体の場合、すべてのメンバーはこれらの規則に従って (再帰的に) 初期化され、パディングはゼロ ビットに初期化されます。
— 共用体の場合、最初の名前付きメンバーはこれらの規則に従って (再帰的に) 初期化され、パディングはゼロ ビットに初期化されます。
...
21 集合体の要素またはメンバーよりもブレースで囲まれたリストに初期化子が少ない場合、または配列内の要素よりも既知のサイズの配列を初期化するために使用される文字列リテラルの文字が少ない場合、集合体の残りの部分静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。
したがって、あなたの例でaa.a
は、初期化子のために明示的に 0 に初期化されますaa.b
が、上記の句のために暗黙的に 0 に初期化されます。