punteros - Dilema de inicialización de matriz Char
punteros y matrices en c (3)
Considera seguir el código:
// hacky, since "123" is 4 chars long (including terminating 0)
char symbols[3] = "123";
// clean, but lot of typing
char symbols[3] = {''1'', ''2'', ''3''};
entonces, el giro se describe en realidad en el comentario al código, ¿hay alguna manera de inicializar char[]
con string literal sin terminar cero?
Actualización : parece que IntelliSense está equivocado, este comportamiento se define explícitamente en C estándar.
1) Los problemas que mencionas no son problemas . 2) Que: ¿Hay alguna forma de inicializar char [] con cadena literal sin terminar cero? - ya estás haciendo eso.
Esta
char symbols[3] = "123";
es una declaración válida.
De acuerdo con la Especificación ANSI C de 1988:
Una matriz de tipo de caracteres puede inicializarse mediante un literal de cadena de caracteres, opcionalmente encerrado entre llaves. Los caracteres sucesivos del literal de cadena de caracteres (incluido el carácter nulo de terminación si hay espacio o si el conjunto es de tamaño desconocido) inicializan los miembros de la matriz.
Por lo tanto, lo que estás haciendo es técnicamente bueno.
Tenga en cuenta que las matrices de caracteres son una excepción a las restricciones establecidas en los inicializadores:
No habrá más inicializadores en la lista de inicializadores que objetos para inicializar.
Sin embargo, la corrección técnica de un fragmento de código es solo una pequeña parte de la "bondad" del código. Los char symbols[3] = "123";
línea de caracteres char symbols[3] = "123";
golpeará de inmediato al programador veterano como sospechoso porque, al parecer, se trata de una inicialización de cadena válida y, posteriormente, puede utilizarse como tal, dando lugar a errores inesperados y a una muerte segura.
Si deseas seguir esta ruta, debes estar seguro de que es lo que realmente quieres. Salvar ese byte adicional no vale la pena el problema que esto podría hacerte entrar. El símbolo NULL, en todo caso, le permite escribir un código mejor y más flexible porque proporciona una manera inequívoca (en la mayoría de los casos) de terminar la matriz.
(Borrador de especificación disponible aquí ).
Para cooptar el comentario de Rudy en otra parte de esta página, el 32 ° Ejemplo del Borrador de C99 en §6.7.8 (p.130) establece que las líneas
char s[] = "abc", t[3] = "abc";
son idénticos a
char s[] = { ''a'', ''b'', ''c'', ''/0'' },
t[] = { ''a'', ''b'', ''c'' };
De donde puede deducir la respuesta que está buscando.
El borrador de la especificación C99 se puede encontrar aquí .
Si su matriz tiene solo 3 caracteres de largo, la primera línea de código es idéntica a la segunda línea. El ''/0''
al final de la cadena simplemente no se almacenará. IOW, no hay nada "sucio" o "incorrecto" con él.