Каково поведение инициализации массива C11, когда дескрипторы перекрываются? - PullRequest
0 голосов
/ 10 мая 2018

Учитывая это

int array[10] = {
[0] = 1, 1, 1, 1, 1, 1, 1, // 7 values
[5] = 9
};

gcc (6.3.1) не генерирует ошибку или предупреждение о том, что инициализация перекрывается.

Что такое определяющее поведение? Это должно быть предупреждение или массив инициализируется в порядке появления указателя?

1 Ответ

0 голосов

Предупреждение нет . Массив инициализируется в порядке вхождения указателя , поэтому более поздние обозначения переопределяют предыдущие.

В вашем примере вы сначала присвоили первые семь значений (индекс от 0 до 6) с 1, а затем присвоили шестое значение (индекс 5) с 9.

Ваш массив будет содержать значения (в порядке от 0 до 9)

  • 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 из первого определения, [0] = 1, 1, 1, 1, 1, 1, 1,
  • 1, 1, 1, 1, 1, 9, 1, 0, 0, 0 со второго, [5] = 9

Это также соответствует стандартам C99 и C11, как говорится

«Инициализация должна происходить в порядке списка инициализаторов, каждый инициализатор предоставляется для определенного подобъекта, перекрывая любой ранее указанный инициализатор для того же подобъекта»

...