Error de compilación de C: "Es posible que el objeto de tamaño variable no se inicialice"

Resuelto helloWorld asked hace 14 años • 8 respuestas

¿Por qué recibo el error "Es posible que el objeto de tamaño variable no se inicialice" con el siguiente código?

int boardAux[length][length] = {{0}};
helloWorld avatar Jun 21 '10 14:06 helloWorld
Aceptado

Supongo que está utilizando un compilador C99 (con soporte para matrices de tamaño dinámico ). El problema en su código es que en el momento en que los compiladores ven su declaración de variable no pueden saber cuántos elementos hay en la matriz (también estoy asumiendo aquí, por el error del compilador, que lengthno es una constante de tiempo de compilación).

Debes inicializar manualmente esa matriz:

int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
David Rodríguez - dribeas avatar Jun 21 '2010 08:06 David Rodríguez - dribeas

Recibe este error porque en lenguaje C no se le permite usar inicializadores con matrices de longitud variable. El mensaje de error que recibe básicamente lo dice todo.

6.7.8 Inicialización

...

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

AnT stands with Russia avatar Jun 21 '2010 08:06 AnT stands with Russia

Esto da error:

int len;
scanf("%d",&len);
char str[len]="";

Esto también da error:

int len=5;
char str[len]="";

Pero esto funciona bien:

int len=5;
char str[len]; //so the problem lies with assignment not declaration

Necesitas poner valor de la siguiente manera:

str[0]='a';
str[1]='b'; //like that; and not like str="ab";
Amitesh Ranjan avatar Nov 08 '2014 09:11 Amitesh Ranjan

Después de declarar la matriz

int boardAux[length][length];

La forma más sencilla de asignar los valores iniciales como cero es usar el bucle for, incluso si puede ser un poco largo.

int i, j;
for (i = 0; i<length; i++)
{
    for (j = 0; j<length; j++)
        boardAux[i][j] = 0;
}
Krishna Shrestha avatar Mar 27 '2016 12:03 Krishna Shrestha

Las matrices de longitud variable son matrices cuya longitud el compilador no conoce en el momento de la compilación. En tu caso lengthes una variable. Concluyo esto, porque si, por lengthejemplo, una macro de preprocesador estuviera definida como un número entero literal, su inicialización funcionaría. El primer estándar del lenguaje C de 1989 no permitía matrices de longitud variable; se agregaron en 1999. Aún así, el estándar C no permite que se inicialicen con una expresión como la suya (aunque se podría argumentar que podría o debería permitirlo).

La mejor manera de inicializar una matriz de variables es así:

int boardAux[length][length];
memset( boardAux, 0, sizeof(boardAux) );

memsetes una función de biblioteca estándar muy rápida para inicializar la memoria (a 0 en el caso anterior). sizeof(boardAux)devuelve el número de bytes ocupados por boardAux. sizeofsiempre está disponible pero memsetrequiere #include <string.h>. Y sí, sizeofpermite un objeto de tamaño variable como argumento.

Tenga en cuenta que si tiene una matriz normal (no de longitud variable) y solo desea inicializar la memoria a cero, nunca necesitará paréntesis anidados, puede inicializarla simplemente así:

struct whatEver name[13][25] = {0};
Oskar Enoksson avatar Sep 20 '2021 01:09 Oskar Enoksson