構造体の初期化指定子は、括弧で囲まれ、コンマで区切られた値のリストです。初期化指定子には、等号 (=) が前に付いています。 指定がなければ、構造体メンバーのメモリーは宣言された順に割り振られます。メモリー・アドレスは昇順で割り当てられ、最初のコンポーネントは構造体名自身の開始アドレスで始まります。構造体のすべてのメンバーを初期化する必要はありません。 static ストレージを持つ構造体のデフォルトの初期化指定子は各コンポーネントの 再帰的デフォルトです。automatic ストレージを持つ構造体には何も含まれません。
以下の小節は、C にのみ適用されます。
構造体の名前付きメンバーは、任意の順番で初期化できます。 共用体の名前付きメンバーは、最初のメンバーでなくても初期化できます。 指定機能 は、初期化する構造体または共用体のメンバーを識別します。 構造体または共用体のメンバー用の指定機能は、ドットおよびその ID (.fieldname) で 構成されます。 指定機能リスト は、任意の集合体型用の 1 つまたは複数の指定機能の組み合わせです。指定 は、等号 (= ) が後に付いた指定機能リストです。
指定機能は、初期化の最初では 構造体自身である現行オブジェクトの最初のサブオブジェクトを識別します。 最初のサブオブジェクトを初期化した後は、次のサブオブジェクトが現行オブジェクトになり、 その最初のサブオブジェクトが初期化されます。 つまり、初期化は前方向の順番で進み、直前のサブオブジェクトの初期化はオーバーライドされます。
構造体または任意の集合体型の 自動変数の初期化指定子を、定数式または非定数式にすることができます。 初期化指定子を定数式または非定数式にすることができるのは、C99 言語フィーチャーです。
構造体の以下の宣言は、明示的 な初期化を提供することによってどのサブオブジェクトが初期化されるかについてのあいまいさを 除去する指定機能を含む定義です。 以下の宣言では、2 つのエレメント構造体を使用して配列を定義します。 以下の引用では、[0].a および [1].a[0] が指定機能リストです。
struct { int a[5], b; } game[] = { [0].a = { 1 }, [1].a[0] = 2 }; /* game[0].a[0] is 1, game[1].a[0] is 2, and all other elements are zero. */
宣言構文は、初期化指定子リストを示すために中括弧を使用しますが、大括弧形式 として参照されます。 宣言の完全な大括弧形式は、簡潔な形式よりも誤解されにくくなります。 以下の定義は、上記と同じことを実行し、適正で短いですが、大括弧が相互に一致していないので、誤解を招く可能性があります。 2 つの struct game オブジェクトのいずれの b 構造体メンバーも 2 に初期化されません。
struct { int a[5], b; } game[] = { { 1 }, 2 }; /* game[0].a[0] is 1, game[1].a[0] is 2, and all other elements are zero. */
名前のない構造体または共用体の各メンバーは、初期化には関与せず、 初期化が終わると不定値を持ちます。
例
次の定義では、完全に初期化される構造体を示します。
struct address { int street_no; char *street_name; char *city; char *prov; char *postal_code; }; static struct address perm_address = { 3, "Savona Dr.", "Dundas", "Ontario", "L4B 2A1"};
perm_address の値は、次のとおりです。
次の定義では、一部のみが初期化される構造体を示します。
struct address { int street_no; char *street_name; char *city; char *prov; char *postal_code; }; struct address temp_address = { 44, "Knyvet Ave.", "Hamilton", "Ontario" };
temp_address の値は、次のとおりです。
関連参照