В C вы можете частично инициализировать структуру или массив, в результате чего элементы/элементы, которые не упоминаются в инициализаторе, инициализируются нулем. (Раздел C99 6.7.8.19). Например: -
int a[4] = {1, 2};
// a[0] == 1
// a[1] == 2
// a[2] == 0
// a[3] == 0
Вы также можете инициализировать "массив типа символа" строковым литералом (раздел C99 6.7.8.14), а "последовательные символы... инициализировать элементы массива". Например: -
char b[4] = "abc";
// b[0] == 'a'
// b[1] == 'b'
// b[2] == 'c'
// b[3] == '\0'
Все довольно просто. Но что произойдет, если вы явно указали длину массива, но используете литерал, слишком короткий для заполнения массива? Остальные символы ноль-инициализированы или имеют значения undefined?
char c[4] = "a";
// c[0] == 'a'
// c[1] == '\0'
// c[2] == ?
// c[3] == ?
Рассмотрение его как частичного инициализатора имело бы смысл, оно делало бы char c[4] = "a"
вести себя точно так же, как char c[4] = {'a'}
, и это имело бы полезный побочный эффект, позволяя вам с нулевой инициализацией массива всего символа с помощью char d[N] = ""
, но это совсем не ясно для меня, что то, что требует спецификация.