Error de compilación de C: "Es posible que el objeto de tamaño variable no se inicialice"
¿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}};
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 length
no es una constante de tiempo de compilación).
Debes inicializar manualmente esa matriz:
int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
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.
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";
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;
}
Las matrices de longitud variable son matrices cuya longitud el compilador no conoce en el momento de la compilación. En tu caso length
es una variable. Concluyo esto, porque si, por length
ejemplo, 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) );
memset
es 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
. sizeof
siempre está disponible pero memset
requiere #include <string.h>
. Y sí, sizeof
permite 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};