En C, puede inicializar parcialmente una estructura o matriz, con el resultado de que los miembros/elementos que no se mencionan en el inicializador se inicializan en cero. (C99 sección 6.7.8.19). Por ejemplo: -¿Una cadena literal cuenta como inicializador parcial e inicialización cero?
int a[4] = {1, 2};
// a[0] == 1
// a[1] == 2
// a[2] == 0
// a[3] == 0
También puede inicializar "un array de tipo carácter" con una cadena literal (C99 sección 6.7.8.14), y "caracteres sucesivos ... inicializar los elementos de la matriz". Por ejemplo: -
char b[4] = "abc";
// b[0] == 'a'
// b[1] == 'b'
// b[2] == 'c'
// b[3] == '\0'
Todo bastante sencillo. Pero, ¿qué sucede si le das explícitamente la longitud de la matriz, pero usas un literal que es demasiado corto para llenar la matriz? ¿Los caracteres restantes tienen cero inicialización o tienen valores indefinidos?
char c[4] = "a";
// c[0] == 'a'
// c[1] == '\0'
// c[2] == ?
// c[3] == ?
tratándolo como un inicializador parcial tendría sentido, sería char c[4] = "a"
se comportan exactamente igual que char c[4] = {'a'}
, y tendría el útil efecto secundario de lo que le permite cero inicializar una matriz de caracteres toda forma concisa con char d[N] = ""
, pero no está del todo claro para mí que eso es lo que requiere la especificación.
Woot. Encontré una pregunta sobre SO que tiene sentido. Dan, hiciste mi día. –