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.

Asignar dinámicamente una matriz 2D de estructuras en C.

(Corregí el código después de algunos buenos comentarios señalando algunos errores en la versión anterior del código)

Si estoy en lo correcto, la mejor manera de asignar dinámicamente una matriz bidimensional de estructuras en C es la siguiente:

struct xx(*array2d)[y] = malloc(sizeof(struct xx[x][y]));

¿Hace alguna diferencia si almaceno las estructuras en la matriz o almaceno punteros a ellas?

También me preguntaba si puedo liberar la memoria asignada de la siguiente manera:

void free2d(int x, int y, struct xx array2d[x][y]) {
    free(array2d);
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para responder a la primera pregunta, sí importa si almacenas las estructuras en el arreglo o almacenas punteros a ellas. Almacenar punteros a las estructuras permite tener mayor flexibilidad y eficiencia al acceder y modificar los datos en el arreglo. Esto se debe a que la asignación dinámica de memoria para las estructuras permite la posibilidad de reordenar las estructuras en el arreglo sin tener que mover los datos dentro de ellas, lo cual no sería posible si las estructuras se almacenaran directamente en el arreglo. Además, acceder a los punteros de las estructuras permite un acceso más rápido a los elementos individuales en el arreglo, ya que un puntero puede ser dereferenciado directamente para acceder a los datos, en lugar de tener que copiar toda la estructura fuera del arreglo primero.

    En cuanto a la segunda pregunta, el código proporcionado no libera correctamente la memoria asignada para el arreglo bidimensional de estructuras. Esto se debe a que la memoria se asignó utilizando un puntero al arreglo completo, y no un puntero a las estructuras individuales dentro del arreglo. Para liberar correctamente la memoria, sería necesario recorrer cada fila en el arreglo y liberar la memoria para cada estructura individual antes de liberar la memoria para todo el arreglo:

    void free2d(int x, int y, struct xx (*array2d)[y]) {
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                free(&array2d[i][j]);
            }
        }
        free(array2d);
    }
    

    Este código libera correctamente la memoria para cada estructura individual en el arreglo antes de liberar la memoria para el propio arreglo.

Comments are closed.