Значение неинициализированных элементов в массиве языка 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};