初期化の集約型
「」集約型は構造体共用体配列型です。集約型 (が集約型のメンバーが含まれている場合は初期化の規則が再帰的に適用されます。
構文
初期化子 :
集約の初期化の { の 初期化子リスト } /* */{ の 初期化子リスト }
初期化子リスト :
初期化子初期化子リストの の 初期化子
初期化子リストは コンマで区切った初期化子リストです。リストの各 initializer には定数式または初期化子リストです。したがって初期化子リストは入れ子にできます。このフォームはこのセクションの例に示すように集約型の集約メンバーを初期化するために役立ちます。ただし自動識別子の初期化子が単一の式は定数式である必要はありません ; これは識別子を割り当てるための適切な型を持つ必要があります。
各初期化子リストでは定数式の値は集約変数の対応するメンバーに割り当てます。
初期化子リストに 集約型 (ほどの値がの場合は集約型のメンバーまたはそのほかの要素は 0 に初期化されます。明示的に初期化自動識別子の初期値は未定義です。 初期化子リストに 集約型 (より多くの値がの場合はエラーが発生します。これらの規則は埋め込みの初期化子リストに全体として集計に適用されます。
構造体の初期化子は同じ式の型または中かっこ () で囲まれたメンバーの初期化子リストです。名前のないビット フィールドのメンバーを初期化します。
共用体を初期化すると 初期化子リストは 一つの定数式である必要があります。定数式の値が共用体のメンバーに割り当てます。
配列のサイズが不明な場合は初期化子の数は配列のサイズを確認し型は完全になります。初期化子の繰り返しを C で指定するかすべての前の値も指定せずに配列の途中で要素を初期化する方法はありません。プログラムでこの操作が必要な場合はアセンブリ言語のルーチンを記述します。
初期化子の数が配列のサイズを設定できることに注意してください :
int x[ ] = { 0, 1, 2 }
サイズを指定し初期化子の数を設定するとコンパイラはエラーを生成します。
Microsoft 固有の仕様 →
配列の最大サイズは size_t によって定義されます。STDDEF.H ヘッダー ファイルで定義されます。size_t がスコープに 0x00000000 0x7CFFFFFF で unsigned int です。
終了 Microsoft 固有の仕様→
例
この例では配列の初期化子を次に示します。
int P[4][3] =
{
{ 1, 1, 1 },
{ 2, 2, 2 },
{ 3, 3, 3,},
{ 4, 4, 4,},
};
このステートメントは4 × 3 として P を宣言し1 に 4 番目の行を使用して2 行目の要素への 2 行目の要素などを初期化します。3 番目と 4 行の初期化子リストの最後の定数式の後にコンマを含むことに注意してください。最後の初期化子リスト ({4, 4, 4,},) はコンマを指定します。これらのにコンマはできますが必須ではありません ; 互いに定数式を区切ります別のアプリケーションから別の 1 種類の初期化子リストが必要なコンマコンマだけ。
集約メンバーが初期化子リストがない場合値は subaggregate のメンバーごとに単に割り当てます。したがって前の例の初期化は次のコードと同じです :
int P[4][3] =
{
1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4
};
中かっこは一覧の個別の初期化子の周りに表示されることで上の例を明確化できます。
集約変数を初期化すると中かっこと初期化子リストを正しく使用するようになります。次の例ではコンパイラの中かっこの解釈の詳細を説明するものです :
typedef struct
{
int n1, n2, n3;
} triplet;
triplet nlist[2][3] =
{
{ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }, /* Row 1 */
{ { 10,11,12 }, { 13,14,15 }, { 16,17,18 } } /* Row 2 */
};
この例ではnlist は構造体の配列3 人の構造体メンバーを持つ各 2 × 3 として宣言されています。次のように初期化の 1 行は nlist の最初の行に値を割り当てる :
1 行の最初の中かっこは nlist () nlist[0] の最初の集約メンバーの初期化が開始されたことをコンパイラに通知します。
2 番目の左中かっこは nlist[0] (構造体) nlist[0][0] の最初の集約メンバーの初期化が開始されていることを示します。
最初の右中かっこは構造体の初期化を nlist[0][0]exit; 次の中かっこは nlist[0][1] の初期化が開始されます。
プロセスは最後の右中かっこが nlist[0] の初期化を終了行の末尾まで続行されます。
2 行には同じように nlist の 2 行目に値を割り当てます。行 1 および 2 の初期化子を囲む中かっこの外部の設定が必要であることに注意してください。外部のかっこを省略する次の構築とエラーが発生します :
triplet nlist[2][3] = /* THIS CAUSES AN ERROR */
{
{ 1, 2, 3 },{ 4, 5, 6 },{ 7, 8, 9 }, /* Line 1 */
{ 10,11,12 },{ 13,14,15 },{ 16,17,18 } /* Line 2 */
};
このブロックでは1 行の最初の中かっこは 3 個の構造体の配列である nlist[0] の初期化が表示されます。値 123 は最初の 3 の構造体のメンバーに割り当てます。値 (3) nlist[0] 構造体の初期化が 3 の配列が完了したら次の右中かっこが見つかった場合は2 種類の残りの構造自動的に 0 に初期化されます。同様に{ 4,5,6 } は nlist の 2 番目の行の最初の構造体を初期化します。nlist[1] の残りの 2 個の構造体は 0 に設定されます。コンパイラは次の初期化子リスト ({ 7,8,9 }) が検出されたときにnlist[2] を初期化します。nlist に 2 行しかないためこのエラーが発生します。
次の例ではx の int のメンバーの 3 人12および 3 にそれぞれ初期化します。
struct list
{
int i, j, k;
float m[2][3];
} x = {
1,
2,
3,
{4.0, 4.0, 4.0}
};
上記の list の構造体にはm の最初の行の 3 番目の要素は 4.0 に初期化 ; m の残りの行の要素は既定ではは 0.0 に初期化されます。
union
{
char x[2][3];
int i, j, k;
} y = { {
{'1'},
{'4'}
}
};
共用体変数の y はこの例では初期化します。共用体の最初の要素が配列であるため初期化子は初期化子の集約です。初期化子リスト {'1'} は配列の最初の行に値を割り当てます。1 の値のみが一覧に表示されるため最初の列の要素は文字 1 に初期化され行の残りの要素は 2 個値は既定で 0 に初期化します。同様にx の 2 番目の行の最初の要素は文字 4 に初期化され行の残りの 2 要素の値は 0 に初期化されます。