21

以下のコードの意味は何ですか? コードは、GCC の回帰テスト スイートからのものです。

static char * name[] = {
   [0x80000000]  = "bar"
};
4

3 に答える 3

28

C99 では、割り当てられた値に配列インデックスを指定できます。次に例を示します。

static char * name[] = {
   [3]  = "bar"  
};

と同じです:

static char * name[] = { NULL, NULL, NULL, "bar"};

配列のサイズは 4 です。ideaoneで動作するサンプル コードを確認してください。コード配列のサイズは0x80000001(16 進数) です。
注: で初期化された未初期化要素0

5.20 指定された初期化子:

ISO C99 では、適用する配列インデックスまたは構造フィールド名を指定して、要素を任意の順序で指定できます。GNU C では、これを C89 モードの拡張としても許可しています。この拡張機能は GNU C++ では実装されていません。配列インデックスを指定する[index] =には、要素値の前に記述します。例えば、

 int a[6] = { [4] = 29, [2] = 15 };

と同等です

 int a[6] = { 0, 0, 15, 0, 29, 0 };

GNU 拡張では、もう 1 つの興味深い宣言が可能です。

GCC 2.5 以降は廃止されていますが、GCC ではまだ受け入れられている this の代替構文は[index]、 no を使用して要素値の前に書き込むこと=です。

要素の範囲を同じ値に初期化するには、次のように記述し[first ... last] = valueます。例えば、

 int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 }; 

注:配列の長さは、指定された最大値に 1 を加えた値です。

さらに、要素に名前を付けるこの手法を、連続する要素の通常の C 初期化と組み合わせることができます。指定子を持たない各初期化子要素は、配列または構造体の次の連続する要素に適用されます。例えば:

 int a[6] = { [1] = v1, v2, [4] = v4 };

と同等です

 int a[6] = { 0, v1, v2, 0, v4, 0 };

配列初期化子の要素のラベル付けは、インデックスが文字であるか、列挙型に属する場合に特に役立ちます。例えば:

 int whitespace[256]  = { [' '] = 1,  ['\t'] = 1, ['\h'] = 1,
                          ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 
                        };
于 2013-08-20T07:27:17.093 に答える
8

これは、C99 で導入された指定初期化子と呼ばれ、gcc は拡張機能として GNU89 でもサポートしています。詳細については、こちらを参照してください。

 int a[6] = { [4] = 29, [2] = 15 };

と同等です

 int a[6] = { 0, 0, 15, 0, 29, 0 };
于 2013-08-20T07:29:52.790 に答える