2010-03-11 11 views
13

¿Por qué la matriz a no se inicializa con la variable global size? Se muestra¿Por qué no puedo crear una matriz con el tamaño determinado por una variable global?

#include<stdio.h> 

int size = 5; 

int main() 
{ 
    int a[size] = {1, 2, 3, 4, 5}; 
    printf("%d", a[0]); 

    return 0; 
} 

El error de compilación como

objeto de tamaño variable no puede ser inicializado

Según yo, la matriz debe conseguir inicializado por size.

¿Y cuál sería la respuesta si insisto en usar la variable global (si es posible)?

+0

Use '-std = c99' al compilar con GCC para habilitar matrices de tamaño variable. –

+1

Ya están habilitados; si estuviera en el modo c89, el error sería algo así como 'ISO C90 prohíbe la matriz de longitud variable 'a''. –

Respuesta

16

En C99, 6.7.8/3:

El tipo de la entidad a inicializado será una matriz de tamaño desconocido o un tipo de objeto que es no una variable de tipo longitud de la matriz.

6,6/2:

Una expresión constante se puede evaluar durante la traducción en lugar de tiempo de ejecución

6,6/6:

una constante entera expresión deberá tienen un tipo entero y solo tienen operandos que re integer constantes, constantes de enumeración, constantes de caracteres, tamaño de expresiones cuyos resultados son las constantes enteras, y las constantes flotantes que son los operandos inmediatos de los moldes.

6.7.5.2/4:

si el tamaño es un número entero constante expresión y el tipo de elemento tiene un tamaño constante conocida , el tipo de matriz es no una variable de tipo longitud de la matriz; de lo contrario, el tipo de matriz es un tipo de matriz de longitud variable .

a tiene longitud variable de tipo matriz, porque size no es una expresión constante entera. Por lo tanto, no puede tener una lista de inicializadores.

En C90, no hay VLA, por lo que el código es ilegal por ese motivo.

En C++ tampoco hay VLA, pero puede hacer que size sea const int. Esto se debe a que en C++ puede usar las variables const int en ICE. En C no puedes.

Es de suponer que no tenía la intención a tener longitud variable, así que lo que necesita es:

#define size 5 

Si realmente tenía la intención a tener longitud variable, supongo que se podría hacer algo como esto:

int a[size]; 
int initlen = size; 
if (initlen > 5) initlen = 5; 
memcpy(a, (int[]){1,2,3,4,5}, initlen*sizeof(int)); 

O tal vez:

int a[size]; 
for (int i = 0; i < size && i < 5; ++i) { 
    a[i] = i+1; 
} 

Sin embargo, es difícil decir qué "debería" suceder aquí en el caso de tamaño! = 5. Realmente no tiene sentido especificar un valor inicial de tamaño fijo para una matriz de longitud variable.

9

No necesita decirle al compilador de qué tamaño es la matriz si está dando un inicializador. El compilador calculará el tamaño según la cantidad de elementos con los que lo está inicializando.

int a[] = {1,2,3,4,5}; 

A continuación, puede incluso dejar que el compilador que dicen que el tamaño por conseguir el tamaño total de la matriz de bytes sizeof(a) y dividiéndolo por el tamaño de un elemento sizeof(a[0]):

int size = sizeof(a)/sizeof(a[0]); 
+0

¿Qué sucede si también quiero inicializar todo a cero, por ejemplo? 'int myArray [numRows] [númeroColumnas] = {{0}};' ¿Hay una manera de saltarse los numRows y variables númeroColumnas en la LHS, pero no tiene que escribir todos los ceros en el lado derecho? – VeraKozya

3

Parece que tu compilador no cumple con C99 ... hablando de qué compilador estás usando? Si se trata de gcc que necesita para aprobar el interruptor '-std = c99' .... si está utilizando un compilador de pre-C99, que la declaración es ilegal, si ese es el caso, haga lo siguiente:

 
int main() { 
    int a[5]={1,2,3,4,5}; 
    printf("%d",a[0]); 
    return 0; 
} 

En compiladores estándar anteriores a C99, utilizan una constante en lugar de una variable.

Editar: Puede encontrar más información sobre el estándar C99 here ... y here ....

+0

la última versión de su gcc –

+1

Entonces C99 permite 'int a [size];' donde el tamaño es una variable? No tenía ni idea ... – IVlad

+2

En C99 puedes declarar una matriz de tamaño variable, pero no puedes inicializarla de esta manera. El problema es exactamente lo que dice el mensaje de error. –

3

size es una variable, y C no permite que usted declare (edición: C99 le permite declararlos, simplemente no los inicializa como lo hace) matrices con un tamaño variable como ese. Si desea crear una matriz cuyo tamaño sea una variable, use malloc o haga que el tamaño sea constante.

4

El compilador no puede suponer que el valor del tamaño sigue siendo 5 para cuando main() obtiene el control. Si quieres una verdadera constante en un proyecto de estilo antiguo C, utilice:

#define size 5 
0
#include<stdio.h> 

/* int size=5; */ 
#define size 5 /* use this instead*/ 
/*OR*/ 
int a[size]={1,2,3,4,5}; /* this*/ 

int main() 
{ 
    int a[size]={1,2,3,4,5}; 
    printf("%d",a[0]); 
    return 0; 
} 

int size significa que size es una variable y C no permite variablessize matrices.

estoy usando VS2008 donde el uso

const int size=5; 

permite

int a[size]={1,2,3,4,5}; 
+0

¿por qué no puedo usar variables globales? –

+3

@ashish: porque las variables globales todavía son variables (la pista está en el nombre). Supongamos que alguien asignó el valor '1' a' size' en algún lugar antes de su código para definir 'a'. Entonces estaría tratando de inicializar una matriz de tamaño 1 con una lista de inicializadores de tamaño 5. En lugar de tratar de resolver este lío, el estándar lo prohíbe. –

+0

gracias por ese steve –

1

El compilador necesita saber el tamaño de la matriz mientras la declara. Porque el tamaño de una matriz no cambia después de su declaración. Si coloca el tamaño de la matriz en una variable, puede imaginar que el valor de esa variable cambiará cuando se ejecute el programa. En este caso, el compilador se verá obligado a asignar memoria extra a esta matriz. En este caso, esto no es posible porque la matriz es una estructura de datos estática asignada en la pila. Espero que esto ayude.

Cuestiones relacionadas