¿Por qué no puedo crear una matriz con un tamaño determinado por una variable global?

6 minutos de lectura

avatar de usuario
ashish yadav

¿Por qué la matriz a no ser inicializado por variable global size?

#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 se muestra como

el objeto de tamaño variable no se puede inicializar

Según yo, la matriz debería ser inicializada por size.

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

  • Utilizar -std=c99 al compilar con GCC para habilitar matrices de tamaño variable.

    – Miguel S.

    11 de marzo de 2010 a las 18:06

  • Ya están habilitados; si estuviera en modo c89, el error sería algo así como ISO C90 forbids variable length array 'a'.

    –Steve Jessop

    11 de marzo de 2010 a las 18:26


avatar de usuario
steve jesop

En C99, 6.7.8/3:

El tipo de entidad que se va a inicializar será una matriz de tamaño desconocido o un tipo de objeto que no sea un tipo de matriz de longitud variable.

6.6/2:

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

6.6/6:

Una expresión de constante entera tendrá un tipo entero y solo tendrá operandos que sean constantes enteras, constantes de enumeración, constantes de caracteres, expresiones sizeof cuyos resultados sean constantes enteras y constantes flotantes que sean los operandos inmediatos de las conversiones.

6.7.5.2/4:

Si el tamaño es una expresión constante entera y el tipo de elemento tiene un tamaño constante conocido, el tipo de matriz no es un tipo de matriz de longitud variable; de lo contrario, el tipo de matriz es un tipo de matriz de longitud variable.

a tiene un tipo de matriz de longitud variable, 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 podrías hacer size a const int. Eso es porque en C++ puedes usar const int variables en los ICE. En C no se puede.

Presumiblemente no tenías la intención a para tener una longitud variable, entonces lo que necesitas es:

#define size 5

Si realmente tenías la intención a para tener una longitud variable, supongo que podrías 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 que tamaño != 5. Realmente no tiene sentido especificar un valor inicial de tamaño fijo para una matriz de longitud variable.

avatar de usuario
individuo

No necesita decirle al compilador qué tamaño tiene la matriz si está dando un inicializador. El compilador determinará el tamaño en función de la cantidad de elementos con los que lo esté inicializando.

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

Luego, incluso puede dejar que el compilador le diga el tamaño obteniendo el tamaño total de la matriz en bytes sizeof(a) y dividiéndolo por el tamaño de un elemento sizeof(a[0]):

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

  • ¿Qué pasa si también quiero inicializar todo a cero, por ejemplo? int myArray [numRows][numCols] = {{0}}; ¿Hay alguna manera de omitir las variables numRows y numCols en el LHS, pero no tener que escribir todos los ceros en el RHS?

    – VeraKozya

    17 de febrero de 2018 a las 0:18


  • ¿No sería menos ambiguo referirse a la cantidad de elementos reales en la matriz como longitud y el número de bytes que comprende la matriz en el nivel de memoria como Talla ? Esto tendría la ventaja de ser más compatible con el significado estándar utilizado por el sizeof operador, que simplemente calcula y devuelve el número de bytes sin procesar de la matriz.

    – programadores

    10 de julio de 2018 a las 9:02


El compilador no puede asumir que el valor de tamaño sigue siendo 5 cuando main() toma el control. Si desea una verdadera constante en un proyecto C de estilo antiguo, use:

#define size 5

  • Buen punto. La solución también puede ser el uso de nuevos const int size = 5

    – Fusión

    19 de julio de 2019 a las 9:09

avatar de usuario
IVlad

size es una variable, y C no le permite declarar (editar: C99 le permite declararlos, simplemente no inicializarlos como lo está haciendo) matrices con tamaño variable como ese. Si desea crear una matriz cuyo tamaño sea una variable, utilice malloc o hacer que el tamaño sea una constante.

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 pones el tamaño de la matriz en una variable, puedes imaginar que el valor de esa variable cambiará cuando se ejecute el programa. En este caso, el compilador se verá obligado a asignar memoria adicional a esta matriz. En este caso, esto no es posible porque la matriz es una estructura de datos estática ubicada en la pila. Espero que esto ayude.

Parece que su compilador no es compatible con C99… hablando de eso, ¿qué compilador está usando? Si es gcc, debe pasar el interruptor ‘-std=c99’… si está utilizando un compilador anterior a C99, esa declaración es ilegal, si ese es el caso, haga esto:

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

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

Editar: Puede obtener más información sobre el estándar C99 aquí… y aquí….

avatar de usuario
Deoghare Pratik

#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 un variable y C no permite variablesize arreglos

Estoy usando VS2008 donde usando

const int size=5;  

permite

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

  • ¿Por qué no puedo usar variables globales?

    –Ashish Yadav

    11 de marzo de 2010 a las 18:06

  • @ashish: porque las variables globales siguen siendo variables (la pista está en el nombre). Supongamos que alguien asignó el valor 1 para 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 intentar solucionar este problema, el estándar lo prohíbe.

    –Steve Jessop

    11 de marzo de 2010 a las 18:13


  • “el tamaño es una variable y C no permite matrices de tamaño variable”. deberíamos agregar un punto a su comentario de que: si inicializamos la variable, C permite definir una matriz usando esa variable. Por ejemplo, tamaño int = 5; en un[size]; está totalmente bien.

    – Pedram

    21 de febrero de 2017 a las 23:52

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad