Каким будет значение неинициализированного элемента в массиве?
у меня есть следующий код
int t[] = {
[1] = 45,
[2] = 33
};
каким будет значение t[0]
в этом случае? Он будет содержать мусор?
1 ответов
другое значение(ы) будет инициализировано; из стандарта C11, §6.7.9 инициализации, ¶19 и ¶21:
инициализация должна происходить в порядке списка инициализаторов, каждый инициализатор для конкретного подобъекта переопределяет любой ранее указанный инициализатор для того же подобъекта;151) все подобъекты, которые не инициализируются явно, должны инициализироваться неявно так же, как и объекты со статической длительностью хранения.
151) любой инициализатор для субобъекта, который переопределен и поэтому не используется для инициализации этого субобъекта, может вообще не оцениваться.
Если в списке, заключенном в скобки, меньше инициализаторов, чем элементов или членов агрегата, или меньше символов в строковом литерале, используемом для инициализации массива известного размера, чем элементов в массиве, остальная часть агрегата должна быть инициализирована неявно так же, как объекты со статической длительностью хранения.
и неинициализированные int
с статическая продолжительность хранения имплицитность инициализируется до нуля; тот же раздел, ¶10:
если объект с автоматической длительностью хранения не инициализируется явно, его значение не определено. Если объект со статической или потоковой длительностью хранения не инициализируется явно, то:
- если он имеет тип указателя, он инициализируется к нулевому указателю;
- если он имеет тип указателя, он инициализируется нулевым указателем;
- если он имеет арифметический тип, он инициализируется (положительный или нет) ноль;
- если это агрегат, каждый член инициализируется (рекурсивно) в соответствии с этими правилами, и любое заполнение инициализируется до нулевых битов;
- если это объединение, первый именованный член инициализируется (рекурсивно) в соответствии с этими правила и любые обивка инициализируется нулевым значением бита;
поведение одинаково в C89 и C99.