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

6 minutos de lectura

avatar de usuario
Hola Mundo

¿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}};

  • Como se señaló en la excelente respuesta de David Rodríguez: si la longitud es una variable, necesita memset, pero si la longitud es una constante de tiempo de compilación, entonces la declaración se compila correctamente.

    – Casey

    11 de febrero de 2020 a las 19:17

  • adelante hasta 2020 — enum {length = 0xF } ; int boardAux[length][length] = {0};

    – Chef Gladiador

    7 de agosto de 2020 a las 8:11


  • convirtiéndolo en un const int resolvió este problema para mí.

    – Mota Zart

    12 de febrero de 2021 a las 18:58

  • @MoteZart ¿Lo hizo? Dado const int length = 1; int boardAux[length][length] = {{0}}; boardAux es una matriz de longitud variable y length es no una expresión constante. Recordar, const solo significa solo lectura; no significa “constante”. (length sería una expresión constante en C++, que no admite matrices de longitud variable).

    –Keith Thompson

    21 de septiembre de 2021 a las 8:41

avatar de usuario
David Rodríguez – Dribeas

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 asumo aquí, por el error del compilador que length no es una constante de tiempo de compilación).

Debe inicializar manualmente esa matriz:

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

  • También puedo usar malloc para este propósito, ¿qué pasa con la segunda pregunta? La escribí después de la respuesta de Pavel.

    – Hola Mundo

    21 de junio de 2010 a las 8:10

  • @helloWorld: con matrices asignadas de pila, printf( "%d", boardAux[1][2] ) compila bien. El compilador conoce los tamaños y sabe en qué posición en la memoria está el (1,2)-ésimo elemento. Si usa la asignación dinámica, la matriz es unidimensional y debe realizar los cálculos usted mismo: printf("%d", boardAux[ 1*length + 2 ])

    – David Rodríguez – dribeas

    21 de junio de 2010 a las 8:39


  • @AndreyT: Gracias por señalar el error en el memset gritar. Lo acabo de corregir.

    – David Rodríguez – dribeas

    21 de junio de 2010 a las 8:39

  • ¿Por qué recibo este error en el compilador C99 cuando configuro el length ser – estar static? En C++ 14 funciona bien.

    – Silidrona

    18 dic 2017 a las 20:35

  • quiero saber el porque malloc no es requerido.

    – laberinto

    21 oct 2020 a las 14:36

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";

avatar de usuario
Oskar Enokson

Las matrices de longitud variable son matrices cuya longitud no conoce el compilador en el momento de la compilación. En tu caso length es una variable Concluyo esto, porque si length era una macro de preprocesador, por ejemplo, definida como un entero literal, su inicialización funcionaría. El primer estándar de 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 si – 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á corchetes anidados, puede inicializarla simplemente así:

struct whatEver name[13][25] = {0};

avatar de usuario
Keth

La matriz no se inicializa con la memoria especificada y arroja un error
variable sized array may not be initialised
Prefiero la forma habitual de inicialización,

for (i = 0; i < bins; i++)
        arr[i] = 0;

La pregunta ya está respondida, pero quería señalar otra solución que es rápida y funciona si la longitud no debe cambiarse en tiempo de ejecución. Use la macro #define antes de main() para definir la longitud y en main() su inicialización funcionará:

#define length 10

int main()
{
    int boardAux[length][length] = {{0}};
}

Las macros se ejecutan antes de la compilación real y la longitud será una constante de tiempo de compilación (como lo menciona David Rodríguez en su respuesta). De hecho, sustituirá la longitud con 10 antes de la compilación.

  • hay alguna diferencia real entre {0} y {{0}}?

    – ITJ

    2 de noviembre de 2020 a las 10:48


  • Esto en realidad no crea un objeto de tamaño variable.

    – saagarjha

    13 de mayo de 2021 a las 8:10

avatar de usuario
Krishna Shrestha

Después de declarar la matriz

int boardAux[length][length];

la forma más sencilla de asignar los valores iniciales como cero es usando for loop, 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;
}

  • hay alguna diferencia real entre {0} y {{0}}?

    – ITJ

    2 de noviembre de 2020 a las 10:48


  • Esto en realidad no crea un objeto de tamaño variable.

    – saagarjha

    13 de mayo de 2021 a las 8:10

avatar de usuario
Hormiga

Recibe este error porque en el lenguaje C no puede 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 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.

  • ¿Dónde encontraste esto? ¿Puedes darme un enlace?

    – Hola Mundo

    21 de junio de 2010 a las 8:11

  • @helloWorld: Esto es del estándar de idioma (C99). Puede obtener una copia “de trabajo” con las actualizaciones de TC3 aquí open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf

    – Ant

    21 de junio de 2010 a las 8:13


  • Hay temas en los que algunos siempre no le creerán si solo proporciona una explicación informal. Las matrices de longitud variable son uno de estos temas. +1 por citar el estándar.

    – Pascal Cuoq

    21 de junio de 2010 a las 8:30

  • @AnT Ejecuto el código en C ++, se compila bien, ¿entonces la inicialización de la matriz de tamaño variable es válida en C ++?

    – Abhishek Mané

    23 de abril de 2021 a las 3:50

  • @Abhishek Mane: No. C++ simplemente no tiene matrices de tamaño variable.

    – Ant

    23 de abril de 2021 a las 17:53

¿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