構造体および共用体の初期化
構造体の初期化指定子は、中括弧で囲まれた、コンマで区切られた値のリストです。共用体の 場合、中括弧に入れられた単一の値です。初期化指定子の前には等号 (=) を付けます。
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 one {
int a;
int b;
int c;
};
void main(){
struct one z1; // Members in z1 do not have default initial values.
static struct one z2; // z2.a=0, z2.b=0, and z2.c=0.
struct one z3 = {1}; // z3.a=1, z3.b=0, and z3.c=0.
}
この例では、構造体変数 z1 は自動ストレージを持ち、初期化指定子を持たないため、z1 に含まれるメンバーはすべて、デフォルト初期値を持ちません。構造体変数 z2 は静的ストレージを持ち、そのメンバーはすべてゼロに暗黙的に初期設定されます。
構造体変数 z3 は部分的に初期設定されているため、初期設定されていないメンバーはすべてゼロに暗黙的に初期設定されます。すべての共用体メンバーを初期設定する必要はありません。 静的ストレージを持つ共用体のデフォルト初期化指定子は、最初のコンポーネントのデフォルトです。 自動ストレージを持つ共用体には、デフォルト初期設定はありません。
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" };