In C, you can partially initialize a struct or array, with the result that the members/elements that aren't mentioned in the initializer are zero-initialized. (C99 section 6.7.8.19). For example:-
int a[4] = {1, 2};
// a[0] == 1
// a[1] == 2
// a[2] == 0
// a[3] == 0
You can also initialize "an array of character type" with a string literal (C99 section 6.7.8.14), and "successive characters ... initialize the elements of the array". For example:-
char b[4] = "abc";
// b[0] == 'a'
// b[1] == 'b'
// b[2] == 'c'
// b[3] == '\0'
All pretty straightforward. But what happens if you explicitly give the length of the array, but use a literal that's too short to fill the array? Are the remaining characters zero-initialized, or do they have undefined values?
char c[4] = "a";
// c[0] == 'a'
// c[1] == '\0'
// c[2] == ?
// c[3] == ?
Treating it as a partial initializer would make sense, it would make char c[4] = "a"
behave exactly like char c[4] = {'a'}
, and it would have the useful side-effect of letting you zero-initialize a whole character array concisely with char d[N] = ""
, but it's not at all clear to me that that's what the spec requires.
All the remaining elements of the array will be set to
0
. That is, not onlyc[1]
but alsoc[2]
andc[3]
.Note that this does not depend on the storage duration of
c
, i. e., even ifc
has automatic storage duration the remaining elements will be set to0
.From the C Standard (emphasis mine):
From the C99 standard (as already stated by ouah):
and:
And
char
is an arithmetic type, so the remaining elements of the array will be initialised to zero.Absolutely everywhere in C language it follows the all-or-nothing approach to initialization. If you initialize an aggregate only partially, the rest of that aggregate gets zero-initialized.
One can say that this is excessive and less than optimal with strings, but that's just how it works in C.