指定初期化指定子を使用した配列の初期化

C C は、集合体型の指定初期化指定子をサポートしています。designator は、初期化する特定の配列エレメントを指し、"[index]" の形式を持ちます。ここで、index は定数式です。 指定機能リスト は、任意の集合体型用の 1 つまたは複数の指定機能の 組み合わせです。 指定 は、等号が後に付いた指定機能リストで構成されます。

指定がなければ、配列の初期化は、初期化指定子が示す順番で起こります。 指定が初期化指定子内で表示されると、指定機能によって指示された配列エレメントが初期化されます。その後の初期化は初期化リスト順に正方向に進み、事前に初期化された配列エレメントをオーバーライドし、明示的に初期化されていない任意の配列エレメントをゼロに初期化します。

指定初期化指定子を持たない宣言構文は、初期化指定子リストを示すために中括弧を使用しますが、 大括弧形式 として参照されます。初期化で完全な大括弧形式および最小限の大括弧形式 を使用すると、誤解される可能性が少なくなります。 以下に、同じものを実行する多次元配列 matrix の有効な宣言を示します。 matrix[3][0][0] で始まる行全体など明示的に初期化されていないすべての配列エレメントは、ゼロに初期化されます。

/* minimally bracketed form */
int matrix[4][3][2] = {
    1, 0, 0, 0, 0, 0,
    2, 3, 0, 0, 0, 0,
    4, 5, 6
};
 
/* fully bracketed form */
int matrix[4] [3] [2] = {
    {
    { 1 },
    },
    {
    { 2, 3 },
    },
    {
        { 4, 5 },
        { 6 }
    }
};
 
/* incompletely but consistently bracketed initialization */
int matrix[4] [3] [2] = {
    { 1 },
    { 2, 3 },
    { 4, 5, 6 }
};
 

配列の初期化中に事前のサブオブジェクトの初期化をオーバーライドすることは、指定初期化指 定子にとって必要な振る舞いです。 つまり、配列の両端からスペースを "割り振る" ために単一指定機能が使用されます。 指定初期化指定子 [MAX-5] = 8 は、添え字 MAX-5 における配列エレメン トを値 8 に初期化する必要があることを意味します。配列添え字大括弧で、定数式を囲む必要があ ります。

int a[MAX] = {
      1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0
};
MAX15 の場合、a[5] から a[9] ま でがゼロに初期化されます。 MAX7 の場合、a[2] から a[4] までが、まず それぞれ値 57、および 9 を持ち、その後、値 86、および 4 によってオーバーライドされます。つまり、MAX が 7 の場合、初期化は宣言が書き込まれた場合と同じになります。
int a[MAX] = {
      1, 3, 8, 6, 4, 2, 0
};

関連参照

IBM Copyright 2003