Saltar al contenido

declarar una matriz de longitud variable como una variable global en C

Solución:

Una matriz de longitud variable (es decir, una matriz de tamaño con un valor de tiempo de ejecución) no puede ser una variable global, porque la expresión que está utilizando para el tamaño debe obviamente calcularse en tiempo de compilación. Solo puede vivir en la pila. Presumiblemente, lo que está obteniendo es una matriz estática con un tamaño que depende de en qué parte del código la esté definiendo (porque está redefiniendo algo de lo que depende).

¿Por qué no puede usar un puntero global y realloc () para dimensionarlo según sea necesario?

No puedes hacer eso. Esto es lo que dice el borrador de la norma:

6.7.6.2 Declaradores de matrices

2 Si se declara que un identificador tiene un tipo modificado de forma variable, será un identificador ordinario (como se define en 6.2.3), no tendrá vinculación y tendrá alcance de bloque o alcance de prototipo de función. Si se declara que un identificador es un objeto con una duración de almacenamiento estática o de subprocesos, no deberá tener un tipo de matriz de longitud variable.

También,

10 EJEMPLO 4 Todas las declaraciones de tipos de modificación variable (VM) deben estar en el alcance del bloque o en el alcance del prototipo de función. Los objetos de matriz declarados con el especificador de clase de almacenamiento _Thread_local, estático o externo no pueden tener un tipo de matriz de longitud variable (VLA). Sin embargo, un objeto declarado con el especificador de clase de almacenamiento estático puede tener un tipo de VM (es decir, un puntero a un tipo de VLA). Finalmente, todos los identificadores declarados con un tipo de VM deben ser identificadores ordinarios y, por lo tanto, no pueden ser miembros de estructuras o uniones.

No hay forma de declarar una matriz de longitud variable como una variable global en C, ya que tendría que asignarse antes de conocer su tamaño, por lo que el compilador no puede saber cuánta memoria debe asignarle. Sin embargo, lo que puede (y debe) hacer es asignarlo dinámicamente:

char* my_dynamic_array = NULL;

void f(unsigned int size)
{
    if(!my_dynamic_array) {
        my_dynamic_array = malloc(size);
    }
    /* do something with the array */
}

int main(void)
{
    f(1024); /* set size dynamically */
    /* do something with the array */
    free(my_dynamic_array); /* free the allocated memory */
    return 0;
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *