Подтвердить что ты не робот

Строгое выражение инициализации массива?

В чем смысл следующего кода? Код из набора регрессионных тестов GCC.

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

Ответ 1

В C99 вы можете указать индексы массива для назначенного значения, например:

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

совпадает с:

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

Размер массива равен 4. Проверьте пример кода, работающего в ideaone. В вашем размере массива кода 0x80000001 (его шестнадцатеричное число).
Примечание. Неинициализированные элементы инициализируются с помощью 0.

5.20 Назначенные инициализаторы:

В ISO C99 вы можете указать элементы в любом порядке, указав индексы массива или имена полей структуры, к которым они применяются, и GNU C разрешает это как расширение в режиме C89. Это расширение не реализовано в GNU С++. Чтобы указать индекс массива, напишите [index] = до значения элемента. Например,

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

эквивалентно

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

В расширении GNU возможно еще одно интересное объявление:

Альтернативный синтаксис для этого, который устарел, поскольку GCC 2.5, но GCC по-прежнему принимает, заключается в том, чтобы написать [index] до значения элемента без =.

Чтобы инициализировать диапазон элементов для одного и того же значения, напишите [first ... last] = value. Например,

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

Примечание:, что длина массива - это самое высокое значение, указанное плюс один.

Кроме того, мы можем комбинировать эту технику именования с обычной инициализацией 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 
                        };

Ответ 2

Он назвал назначенный инициализатор, который введен в C99, gcc также поддерживает его в GNU89 как расширение, см. здесь для деталей.

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

эквивалентно

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

Ответ 3

Это назначенный инициализатор C99. значение в скобках указывает индекс для получения значения.