Podría haber jurado que leí que una cadena que se definió pero no se inicializó se configuró en todos NULL. En otras palabras, que
char string[10];constaba de 10 caracteres nulos, y que
char string[10] = "Kevin";consta de las letras 'K', 'e', 'v', 'i', 'n' y cinco nulos.
Es esto cierto:
en otras palabras, esa cadena char[10]; constaba de 10 caracteres nulos,
Eso depende de dónde y de la variable.
char here_yes[10]; // 10 '\0' characters int main() { char here_no[10]; // 10 unknown garbage values static char but_here_also_yes[10]; // also 10 '\0' characters }y ese char string[10] = "Kevin"; consta de las letras 'K', 'e', 'v', 'i', 'n' y cinco nulos. ¿Es esto cierto: siempre?
Sí. Si inicializa parcialmente una cadena o una variable, el resto se rellena con '\0' o ceros.
char this_has_10_nulls[10] = ""; int main() { char this_has_ab_followed_by_8_nulls[10] = { 'a', 'b' }; static char this_has_Kevin_followed_by_5_nulls[10] = "Kevin"; }Si no hay un inicializador presente (como en su primer ejemplo), todos los elementos de la matriz tendrán valores indeterminados. De este Proyecto de Norma C11 :
6.7.9 Inicialización
…
10 Si un objeto que tiene duración de almacenamiento automático no se inicializa explícitamente, su valor es indeterminado.
Sin embargo, si proporciona algún tipo de inicializador (como en su segundo ejemplo), cualquier elemento en la matriz que no esté configurado explícitamente se inicializará a cero. De unos pocos párrafos más adelante en el Estándar:
21 Si hay menos inicializadores en una lista entre llaves que elementos o miembros de un agregado, o menos caracteres en una cadena literal utilizada para inicializar una matriz de tamaño conocido que elementos en la matriz, el resto del agregado se inicializará implícitamente igual que los objetos que tienen una duración de almacenamiento estática.
(Tenga en cuenta que un char de duración de almacenamiento estático se inicializará a cero).