Размер массива char больше, чем количество элементов, переданных для его инициализации [дубликат]


На этот вопрос уже есть ответ здесь:

Для массивов типа int или double, если размер массива больше, чем число элементов, предоставленных при инициализации массива (например, список), остальные элементы в массиве по умолчанию равны 0, верно?

Что происходит при инициализации массив символов с меньшим количеством элементов, чем размер, который я предоставляю? Как

char ch[10] = { 'h', 'e', 'l', 'l', 'o' };

Присваивается ли остальным элементам какое-либо значение? Или это просто мусор в памяти?

1 2

1 ответ:

Это заявление

char ch[10] = { 'h', 'e', 'l', 'l', 'o' };

Эквивалентно этому объявлению

char ch[10] = { "hello" };

, что в свою очередь эквивалентно следующему объявлению

char ch[10] = "hello";

И все эти объявления эквивалентны следующему объявлению

char ch[10] = { 'h', 'e', 'l', 'l', 'o', '\0', '\0', '\0', '\0', '\0', };

То есть элементы массива, не имеющие явных инициализаторов, неявно инициализируются нулем.

Из стандарта C (инициализация 6.7.9)

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

...

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

И

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