La respuesta a la pregunta que ha citado es incorrecta. La respuesta correcta es "No. El código no compilará", asumiendo un compilador de C formalmente correcto (a diferencia de los caprichos de un compilador específico).
El lenguaje C no permite el uso de un literal de cadena excesivamente largo para inicializar una matriz de caracteres de un tamaño específico. La única flexibilidad permitida por el lenguaje aquí es el carácter de terminación \0
. Si la matriz es demasiado corta para acomodar la terminación \0
, la terminación \0
se elimina silenciosamente. Pero los caracteres de cadena literales reales no se pueden descartar. Si el literal es demasiado largo, es una violación de restricción y el compilador debe emitir un mensaje de diagnóstico.
char s1[5] = "abc"; /* OK */
char s2[5] = "abcd"; /* OK */
char s3[5] = "abcde"; /* OK, zero at the end is dropped (ERROR in C++) */
char s4[5] = "abcdef"; /* ERROR, initializer is too long (ERROR in C++ as well) */
Quien escribió su "libro" sabía de lo que estaban hablando (al menos sobre este tema específico). Lo que dicen en la respuesta es totalmente incorrecto.
Nota: El suministro de inicializadores de cadena excesivamente largos es ilegal en C89/90, C99 y C++. Sin embargo, C++ es aún más restrictivo en este sentido. C++ prohíbe colocar el carácter de terminación \0
, mientras que C permite soltarlo, como se describe anteriormente.
Este ejemplo es bastante claro, pero probablemente debería especificar el idioma, si no el libro. –
¿Qué parte no entiendes? –
@ mmyers esta parte - "El compilador nunca detecta el error si se exceden los límites de una matriz." –