Считаются ли строковые литералы частичными инициализаторами и нулями -?

В 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'

Все довольно просто. Но что произойдет, если вы явно укажете длину массива, но используете слишком короткий литерал для заполнения массива? Остальные символы инициализированы нулем -или имеют неопределенные значения?

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] = "", но мне совершенно не ясно, что именно этого требует спецификация.

14
задан Dan Hulme 2 August 2012 в 15:24
поделиться