構造体の初期化

配列と同じように、構造体の変数も初期化子を用いて宣言と同時に初期化できます。初期化の方法も配列と同じで、初期化子並びの先頭から順に、構造体のメンバに割り当てられます。初期化子並びに指定された値の数がメンバの数よりも少なければ、残りのメンバは0で初期化されます。

Sample03

#include <stdio.h>

int main(void)
{
    struct { int x, y; } pt = { 10, 20 };

    printf("x=%d, y=%d\n", pt.x, pt.y);

    return 0;
}

実行結果

Sample03の実行結果

Sample03はint型のメンバ x と y を持つ構造体型の変数ptを、宣言と同時に初期化しています。初期化子並びには10と20の2つの値を指定します。これらの値は、構造体の宣言でメンバが出現した順に割り当てられるため、最初の値10は x メンバに、次の20は y メンバに保存されます。実行結果を見れば、初期化子並びに指定した値で、メンバが正しく初期化されていることが確認できます。

配列のメンバ

構造体のメンバには、任意の型を指定することができます。よって、何らかの配列型のメンバを持つことも可能です。文字列を含む構造体や、大きなデータ配列を持つ構造体に適用できます。配列型のメンバを持つ構造体を初期化するには、多次元配列の初期化と同じように、初期化子並びを表す波括弧 { } を入れ子にします。配列型メンバに該当する初期化子に初期化子並び { } を指定することで、構造体内の配列型のメンバを初期化できます。

Sample04

#include <stdio.h>

int main(void)
{
    int i;
    struct {
        int ary1[5];
        int ary2[3];
        int ary3[6];
    } obj = {
        { 1, 2, 3, 4, 5 },
        { 10, 20, 30 },
        { 100, 200, 300, 400 }
    };

    printf("ary1 ");
    for(i = 0 ; i < 5 ; i++) printf("%d, ", obj.ary1[i]);

    printf("\nary2 ");
    for(i = 0 ; i < 3 ; i++) printf("%d, ", obj.ary2[i]);

    printf("\nary3 ");
    for(i = 0 ; i < 6 ; i++) printf("%d, ", obj.ary3[i]);

    printf("\n");

    return 0;
}

実行結果

Sample04の実行結果

Sample04のobj変数は、それぞれが異なる要素数のint型の配列ary1、ary2、ary3 メンバを持つ構造体です。この変数を初期化するために、構造体を初期化する初期化子の中に、配列を初期化する初期化子並びを指定しています。