Ningún error del comstackdor cuando la matriz de caracteres de tamaño fijo se inicializa sin espacio suficiente para el terminador nulo

Supongamos que tengo las siguientes matrices c char:

char okaysize4[5] = "four"; // line 5 char toosmall4[4] = "four"; // line 6 char toosmall3[3] = "four"; // line 7 

Cuando compilo con gcc 4.4.7, aparece el siguiente error:

array.c: 7: warning: initializer-string para array de caracteres es demasiado largo

Este error se espera para la línea 7, ya que estoy intentando rellenar 5 caracteres ("four" + \0) en una matriz de 3 elementos. Además, no se espera ningún error para la línea 5 ya que la matriz de 5 elementos es lo suficientemente grande.

Sin embargo, estoy sorprendido de que no haya un error similar para la línea 6. Lo que termina siendo inicializado en toosmall4 es una cadena sin terminar, que puede causar todo tipo de problemas.

Según entiendo, el literal "four" la serie c debe tener cinco caracteres, debido al terminador nulo. De hecho, sizeof("four") es 5. Entonces, ¿por qué el comstackdor no da un error aquí?

¿Hay alguna forma en que pueda alterar mi statement / definición / inicialización para que se marque un error en este caso?

Este es el comportamiento esperado para la línea 6, del borrador del estándar C99 sección 6.7.8 Inicialización párrafo 14 dice ( énfasis mío ):

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 elementos del conjunto.

En el proyecto de norma C11, la sección pertinente con una redacción similar es 6.7.9 párrafo 14 , y como dice la C Preguntas frecuentes :

Por lo tanto, la matriz no es una verdadera cadena C y no se puede usar con strcpy, el formato% s de printf, etc.

Como señaló Keith Thompson, C ++ es más estricto, la sección relevante del borrador del estándar C ++ dice lo siguiente:

No habrá más inicializadores que elementos de matriz. [Ejemplo:

 char cv[4] = "asdf"; // error 

está mal formado ya que no hay espacio para el seguimiento implícito ‘\ 0’. -Final ejemplo]

Es legal, toosmall4 no es una cadena, sino una matriz de caracteres válida (sin el carácter nulo de terminación).

Referencia: C Preguntas frecuentes .