es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tamaño de arreglo entero en C sin utilizar asignación dinámica de memoria.

Necesito declarar una matriz de estructuras con tamaño symbolnum, pero como symbolnum es variable, C producirá un error al escribir el siguiente código:

extern int symbolnum;

struct SymbTab stab[symbolnum];

Ya he intentado lo siguiente:

extern int symbolnum;
const int size = symbolnum;
struct SymTab stab[size];

¿Hay alguna manera de lograr esto sin usar funciones de asignación de memoria dinámica como malloc() o inicializando el tamaño de la matriz con un número muy grande?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una solución para declarar un array de estructuras con tamaño variable en C, sin usar funciones de asignación de memoria dinámica como malloc() o inicializando el tamaño del array usando un número muy grande, es usar la funcionalidad de C99 conocida como miembros de array flexibles.

    Para usar miembros de array flexibles, se agrega un miembro al final de la definición de la estructura que no tiene un tamaño definido, como este:

    struct SymbTab {
        /* miembros existentes... */
        int valores[];
    };
    

    Ahora, al declarar un array de estructuras con esta definición, se puede especificar el tamaño del miembro de longitud variable con la variable symbolnum:

    extern int symbolnum;
    struct SymbTab stab[symbolnum];
    

    Esto asignará memoria para toda la struct SymbTab, incluyendo el miembro de array flexible, que se puede acceder como si fuera un array regular:

    stab[i].values[j] = 42;
    

    Cabe destacar que no se debe usar sizeof(struct SymbTab) para calcular el tamaño de la estructura, ya que esto no incluirá el miembro de longitud variable y dará como resultado cálculos erróneos. En su lugar, se puede calcular el tamaño de cada elemento del array por separado, como así:

    size_t size_elemento = sizeof(struct SymbTab) + symbolnum * sizeof(int);
    

    Esto proporcionará el tamaño correcto para cada elemento del array, incluyendo el miembro de array de longitud variable, para que se pueda utilizar con funciones como memcpy() o fwrite().

Comments are closed.