2010-09-23 35 views
15

¿Qué sucede en C cuando se crea una matriz de longitud negativa?Declaración de una matriz de longitud negativa

Por ejemplo:

int n = -35; 

int testArray[n]; 

for(int i = 0; i < 10; i++) 
    testArray[i]=i+1; 

Este código se compilará (y hace aparecer ninguna advertencia con -Wall habilitados), y parece que se puede asignar a testArray[0] sin problema. Asignar el pasado que da un error de instrucción segfault o ilegal, y leer algo de la matriz dice "Abortar trampa" (no estoy familiarizado con eso). Me doy cuenta de que esto es algo académico, y (con suerte) nunca surgiría en la vida real, pero ¿hay alguna forma particular que el estándar C diga para tratar tales matrices, o es diferente del compilador al compilador?

+0

Hay un punto y coma no deseado (';') al final de la declaración 'for', creo ... – Arun

+0

¡Gracias, lo arreglé! – jonmorgan

Respuesta

20

Es un comportamiento indefinido, porque rompe un "debe" restricción:

C99 §6.7.5.2:

Si el tamaño es una expresión que es no es una constante, expresión entera. .. ... cada vez que se evalúa debe tener un valor mayor que cero.

+0

¡Gracias! Eso es exactamente lo que estaba buscando. – jonmorgan

+2

+1, exactamente la respuesta. Pero me parece bastante decepcionante que los compiladores aún no puedan hacer un análisis estático de este tipo de código y emitan al menos una advertencia. Probé también con 'clang' y' -analyse', no mejor. –

3

comportamiento indefinido, creo, aunque no me cita en eso.

Esto da el error error: size of array 'testArray' is negative en gcc:

int testArray[-35]; 

aunque, como se ha visto:

int n = -35; 
int testArray[n]; 

no da un error incluso con tanto -Wall y -W.

Sin embargo, si se utiliza la bandera -pedantic, gcc advertirá que la norma ISO C90 prohíbe matriz de longitud variable.

+0

¿Qué es lo que realmente hace? Supongo que lo interpreta como sin firmar para que pueda obtener (MAX_INT-35) –

+1

@ Martin Beckett: ya que es un comportamiento indefinido, compiladores son libres de hacer cualquier cosa, incluso si están comportamiento irracional, ya que la asignación de una matriz de longitud negativa es una tonterías compilables. Si se me permitiera rediseñar C, haría la declaración de longitud de matriz y la indexación de una 'int sin firmar', y se requerirá que el compilador emita un error de tipo cuando 'signed int' se usa para operaciones de longitud o indexación. –

+0

la pregunta fue etiquetada C99, por lo que el aspecto de la matriz de longitud variable está bien desde el punto de vista de los estándares. –

0

estudio de mensaje visual erro de compilation, puede utilizar -1 decir una matriz vacía. Espera int y está pasando int, por lo que no hay error de compilación.

Cuestiones relacionadas