2009-03-30 8 views
6

Mi comprensión siempre ha sido que cuando declaro una matriz en la pila con un tamaño que viene como una variable o parámetro, debería obtener un error.¿Por qué no obtengo un error de compilación al declarar una matriz C con tamaño variable?

Sin embargo, me di cuenta de que no obtengo ningún error si no inicializo explícitamente la matriz (sí, no estará en la pila, pero me pregunto por la falta de error). Por ejemplo, el siguiente código no se compila debido matriz2:

#define N 30 

void defineArrays(int n) 
{ 
    int i,j; 
    int array1[N] = {}; 

    int array2[n] = {}; 

    for(i=0; i<N; ++i) array1[i] = 0; 

    for(j=0; j<n; ++j) array2[j] = 0; 
} 

Pero el código siguiente se compila y se ejecuta, incluso cuando envío un verdadero n de la principal:

#define N 30 

void defineArrays(int n) 
{ 
    int i,j; 
    int array1[N] = {}; 

    int array2[n]; 

    for(i=0; i<N; ++i) array1[i] = 0; 

    for(j=0; j<n; ++j) array2[j] = 0; 
} 

lo que me falta ¿aquí? ¿Está declarando array2 como un puntero? Estoy usando gcc

Actualización: Gracias por todos los que respondieron. El problema era que mi versión de gcc estaba por defecto en C99 por algún extraño motivo (o no tan extraño, tal vez soy demasiado viejo), y asumí incorrectamente que está predeterminado en C90 a menos que le diga lo contrario.

Respuesta

14

C99 introdujo la capacidad de tener matrices de longitud variable que ahora está disponible en GCC (aunque se informa que no cumple totalmente con los estándares). En el segundo ejemplo, parece que está aprovechando esa funcionalidad.

Enlace a la información de GCC acerca de las matrices de longitud variable: http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

+0

Joder, no me he dado cuenta de C99 ahora. He estado usando g ++ por mucho tiempo. – Uri

+0

@Uri No +1 en su pregunta, debido a su maldición. – Alex

3

creo que tiene que elegir que C versión estándar.

gcc -fsyntax-only -std=c89 -pedantic -x c - 

<stdin>: In function ‘defineArrays’: 
<stdin>:6: warning: ISO C forbids empty initializer braces 
<stdin>:8: warning: ISO C90 forbids variable length array ‘array2’ 

vs.

gcc -fsyntax-only -std=c99 -pedantic -x c - 
<stdin>: In function ‘defineArrays’: 
<stdin>:6: warning: ISO C forbids empty initializer braces 
1

Declaración de la matriz con un inicializador fuerza a la matriz a ser estática (creado en tiempo de compilación), aunque el ámbito de aplicación es dentro de la función. El compilador no puede definir la matriz en tiempo de compilación porque no conoce el valor de 'n'.

+0

Entiendo eso, pero ¿por qué puedo compilar el segundo? – Uri

1

Cuando compilo el primer ejemplo con gcc, me da este error:

error: variable-sized object may not be initialized 

Me imagino que esto no está permitido porque no se sabe qué tan grande será n, y por lo tanto no puede asegúrese de que sea lo suficientemente grande como para contener todos los elementos que está tratando de inicializar. Es decir, supongamos que tiene un código como éste:

int array2[n] = { 1, 2, 3, 4 }; 

Esto requiere que matriz2 tienen (al menos) 4 ranuras. ¿Qué pasa si n se pasa como cero?

El segundo ejemplo no tiene este problema porque no está haciendo ninguna declaración implícita sobre el tamaño de array2.

Espero que ayude,

Eric melski

defecto gcc
Cuestiones relacionadas