構造体および共用体の初期化

構造体の初期化指定子は、中括弧で囲まれた、コンマで区切られた値のリストです。共用体の 場合、中括弧に入れられた単一の値です。初期化指定子の前には等号 (=) を付けます。

C99 では、共用体型または構造体型の 自動メンバー変数の初期化指定子は定数式または非定数式にすることができます。

構造体および共用体の初期化指定子は、次の 2 とおりの方法で指定できます。
  • C89 スタイルの初期化指定子については、構造体メンバーは、宣言された 順に初期化されなければならず、共用体の場合、最初のメンバーのみ初期化できます。
  • 指定された 初期化指定子、つまり初期化されるメンバーに名前 を付けることを可能にする C99 の機能を使用すると、構造体メンバーを任意の順序で初期化することができ、かつ共用体の任意の (単一) メンバーを初期化することができます。指定された初期化指定子について は、集合体型に対する、指定された初期化指定子 で詳しく説明しています。
次の例では、C89 スタイルの初期化を使用して、共用体変数 people の最初の共 用体メンバーである birthday を初期化する方法を示しています。
union {
      char birthday[9];
      int age;
      float weight;
      } people = {"23/07/57"};
指定された初期化指定子を同じ例に使用すると、以下は 2 番目の共用体メンバー age を初期化します。
union {
      char birthday[9];
      int age;
      float weight;
      } people = { .age = 14 };
次の定義では、完全に初期化される構造体を示します。
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 の値は、次のとおりです。
メンバー
perm_address.street_no 3
perm_address.street_name ストリング "Savona Dr." のアドレス
perm_address.city ストリング "Dundas" のアドレス
perm_address.prov ストリング "Ontario" のアドレス
perm_address.postal_code ストリング "L4B 2A1" のアドレス
名前なし構造体メンバーまたは共用体メン バーは初期化には関係せず、初期化後に中間値を持ちます。 従って、次の例では、ビット・フィールドは初期化されず、初期化指定子 3 は、 メンバー b に適用されます。
struct {
     int a;
     int :10;
     int b;
     } w = { 2, 3 };

構造体または共用体の全メンバーを初期化する必要はありません。初期化されていない構造体 メンバーの初期値は、その構造体変数または共用体変数に関連付けられたストレージ・クラスによ って異なります。静的と宣言された構造体では、初期化されないメンバーはすべて、該当の型のゼロに 暗黙的に初期化されます。自動ストレージが指定された構造体のメンバーは、デフォルトの初期化 は行われません。静的ストレージが指定された共用体のデフォルトの初期化指定子は、最初のコンポー ネントのデフォルトです。自動ストレージが指定された共用体は、デフォルトの初期化は行われません。

次の定義では、一部のみが初期化される構造体を示します。
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 の値は、次のとおりです。
メンバー
temp_address.street_no 44
temp_address.street_name ストリング "Knyvet Ave." のアドレス
temp_address.city ストリング "Hamilton" のアドレス
temp_address.prov ストリング "Ontario" のアドレス
temp_address.postal_code temp_address 変数のストレージ・クラスによって異なります。それが静的の場合、値は NULL になります。
temp_address 変数の 3 番目と 4 番目のメンバーのみを初期化するには、指 定された初期化指定子リストを次のように使用します。
struct address {
                 int street_no;
                 char *street_name;
                 char *city;
                 char *prov;
                 char *postal_code;
               };
struct address temp_address =
               { .city = "Hamilton", .prov = "Ontario" };