Значение неинициализированных элементов в массиве языка C

У меня есть массив из 3 элементов. Но я хочу инициализировать только 2 из них. Я опустил третий элемент.

unsigned char array[3] = {1,2,};
int main(){
  printf("%d",array[2]);
    return 0;
}

результат печати 0. Я тестировал его на IAR и некотором онлайн-компиляторе.

есть ли правило C для значения третьего элемента? Есть ли компилятор, заполняющий третий элемент 0xFF ? (Особенно кросс-компилятор)

3 ответов


да, стандарт C определяет, что происходит в этом случае. Так что нет, не должно быть никаких стандартный компилятор C, который intialises с 0xFF в этом случае.

раздел 6.7.9 стандарта гласит:

инициализации

...

10 ...Если объект со статической или потоковой длительностью хранения не инициализируется явно, затем:

  • если он имеет тип указателя, это инициализируется нулевым указателем;
  • если он имеет арифметический тип, то инициализировано (положительным или беззнаковым) нулем;
  • если это совокупность, каждый член инициализируется (рекурсивно) в соответствии с этими правилами, и любое заполнение инициализируется нулевыми битами;
  • если это союз, первый именованный элемент инициализируется (рекурсивно) в соответствии с этими правилами, и любое обивка инициализируется нулевым значением бита;

...

21 Если в списке, заключенном в скобки, меньше инициализаторов, чем там элементы или члены совокупности символов в строковый литерал, используемый для инициализации массива известного размера являются ли элементы в массиве, остальная часть агрегата должна быть инициализируется неявно так же, как объекты со статическим хранилищем продолжительность.


с этой post, похоже, что этот синтаксис инициализирует все элементы после запятой до нуля. Кроме того, все неинициализированные данные в сегменте данных программы (другими словами все неинициализированные глобальные переменные) автоматически обнуляется, так что если вы ищете неопределенному поведению в программы, нет, он всегда будет 0.


этого можно достигнуть с расширением gcc как ниже беззнаковый char массив[10] = {1,2,[2 ... 9] = значение 0xFF};