Компилятор автоматически не завершает нуль массива. Все, что он делает, это заполнение части, которую вы не инициализировали явно нулями. В вашем случае это только один элемент, который оставил неинициализированным, но это может быть произвольное количество элементов:
char a[14] = {'7', '4', '5'}; // Compiler provides 11 zeros
или вообще, если указать N инициализаторами для массива N элементов нет элементов:
char a[3] = {'7', '4', '5'}; // Compiler provides no zeros
Когда вы позволяете компилятору вывести размер массива из инициализаторов, нет элементов, оставшихся нулевым инициализированным, потому что массив имеет ровно три элемента: '7'
, '4'
и '5'
. Нет места для '\0'
, потому что это эквивалентно ситуации выше, когда компилятор не предоставляет никаких дополнительных нулей.
Вот почему, если вы хотите нулевое завершение вам нужно сделать это самостоятельно, как этот
char a[] = {'7', '4', '5', '\0'};
или пусть компилятор сделает это за вас инициализацию с строкой буквальным, как это:
char a[] = "745";
Примечание: компилятор обеспечит нулевой терминатор для char
массивов инициализируются с строковых литералов только тогда, когда имеется достаточное пространство для терминатора в массиве. Например, char a[3] = "745"
не будет завершен, потому что нет места для '\0'
.
Зачем компилятору автоматически nul-terminate массив? Это не правда. Это верно, только если вы инициализируетесь строковым литералом. –
В первом случае, как вы говорите, ''/0''-терминатор предоставляется компилятором, чтобы заполнить размер массива до 4. Но во втором случае длина массива равна только 3, поэтому не было установлено терминатор. Вам нужно будет определить 'char a [] =" 745 ";' для получения терминатора. –