Каким будет значение неинициализированного элемента в массиве?

у меня есть следующий код

int t[] = {
        [1] = 45,
        [2] = 33
    };

каким будет значение t[0] в этом случае? Он будет содержать мусор?

1 ответов


другое значение(ы) будет инициализировано; из стандарта C11, §6.7.9 инициализации, ¶19 и ¶21:

инициализация должна происходить в порядке списка инициализаторов, каждый инициализатор для конкретного подобъекта переопределяет любой ранее указанный инициализатор для того же подобъекта;151) все подобъекты, которые не инициализируются явно, должны инициализироваться неявно так же, как и объекты со статической длительностью хранения.

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


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

и неинициализированные int с статическая продолжительность хранения имплицитность инициализируется до нуля; тот же раздел, ¶10:

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

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

поведение одинаково в C89 и C99.