char arr[8] = "abc";
полностью эквивалентно
char arr[8] = {'a', 'b', 'c', '\0'};
ISO C 6.7.8. §21 гласит, что
Если в закрытой скобке меньше инициализаторовВ списке, чем есть элементы или члены агрегата, или меньшее количество символов в строковом литерале, используемом для инициализации массива известного размера, чем элементов в массиве, оставшаяся часть агрегата должна быть инициализирована неявно так же, как объекты, которые имеют статическийдлительность хранения.
В простом английском это означает, что все значения в конце вашего массива будут установлены в 0. Таким образом, стандарт гарантирует, что ваш код эквивалентен:
char arr[8] = {'a', 'b', 'c', '\0', 0, 0, 0, 0};
Теперь, конечно, '\ 0' также является нулевым значением.
Это правило универсально для всех массивов, а не только для строк.Кроме того, то же самое применимо при инициализации структуры, но только в явном виде с установкой нескольких ее членов (6.7.8 §18).
Именно поэтому вы можете написать код, подобный
char arr[8] = "";
В этом примере первый элемент массива инициализируется эксплицизацией в '\ 0', а остальные элементы неявно равны нулю.Компилятор переводит это в
char arr[8] = {0, 0, 0, 0, 0, 0, 0, 0};