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.

Desasignar bloque contiguo de memoria para un arreglo 2D.

Entiendo que estoy dividiendo el vector en el doble puntero, pero ¿cómo puedo liberar la memoria si perdí el seguimiento de los datos?

#include <stdio.h>
#include <stdlib.h>

#define width 20
#define height 20

void allocate_matrix(int ***matrix)
{
    double **local_matrix, *data;
    local_matrix = (double **)malloc(sizeof(double *) * height);
    data = (double *)malloc(sizeof(double) * width * height);
    for (int i = 0; i < height; i++)
    {
        local_matrix[i] = &(data[i * width]);
    }
    *matrix = local_matrix;
}

void deallocate_matrix(int **matrix) {
    free(*matrix[0]);
    free(*matrix);
}

int main(void) {
    int **matrix;
    allocate_matrix(&matrix);
    deallocate_matrix(matrix);
    return 0;
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para desasignar la matriz en el código dado, primero debemos liberar la memoria asignada para el puntero de datos y luego liberar la memoria asignada para el puntero local_matrix.

    La función deallocate_matrix debería verse así:

    void deallocate_matrix(double **matrix) {
        free(*matrix); // libera la memoria de datos
        free(matrix); // libera la memoria de local_matrix
    }
    

    Esta función recibe el puntero doble a la matriz y libera la memoria asignada para datos y luego para local_matrix. Podemos llamar a esta función en la función principal una vez que la matriz ya no se necesite.

    int main(void) {
        double **matrix;
        allocate_matrix(&matrix);
        // usa la matriz aquí
        deallocate_matrix(matrix); // libera la memoria antes de retornar
        return 0;
    }
    

    Tenga en cuenta que también necesitamos cambiar el tipo de matriz de int a double, ya que la memoria asignada es para datos de tipo double.

Comments are closed.