¿Cómo liberar una matriz 2d en C?

3 minutos de lectura

avatar de usuario
lina

Tengo el siguiente código:

int **ptr = (int **)malloc(sizeof(int*)*N); 
for(int i=0;i<N;i++) 
     ptr[i]=(int*)malloc(sizeof(int)*N));

como puedo liberar ptr utilizando free? ¿Debería pasar por encima? ptr y gratis ptr[i] o debería simplemente hacer

free(ptr) 

y ptr será liberado?

  • No se trata de gratis, pero quería hablar de malloc. Como ha señalado Srikanth, es bueno si verifica la falla de malloc. Consulte este material: stackoverflow.com/questions/27451220/…

    usuario10719814

    9 sep 2019 a las 23:47

Justo lo contrario de asignación:

for(int i = 0; i < N; i++)
    free(ptr[i]);
free(ptr);

  • ¿Dará falla de segmentación si trato de acceder a una ubicación que he liberado por mí?

    – Varad Bhatnagar

    22 de marzo de 2018 a las 12:41


  • @VaradBhatnagar: en realidad es un comportamiento indefinido. Podría ser un error de segmentación, ¡quién sabe!

    – Donotalo

    10 de abril de 2018 a las 17:07

  • No creo que necesites la tercera línea aquí.

    – Mohamed Ibrahim

    1 de marzo de 2020 a las 1:16

  • @MohamedIbrahim: No, es necesario porque el ptr se mallocó: int **ptr = (int **)malloc(sizeof(int*)*N);

    – Donotalo

    19 de marzo de 2020 a las 10:16

avatar de usuario
James Bedford

Tendrás que hacer un bucle ptr[i]liberando a cada uno int* que atraviesas, como sugieres primero. Por ejemplo:

for (int i = 0; i < N; i++)
{
    int* currentIntPtr = ptr[i];
    free(currentIntPtr);
}

  • Por curiosidad, ¿qué hay de malo en simplemente pasar por el bucle con free(ptr[i])?

    – Russbear

    17 de agosto de 2011 a las 17:02


  • ¡Nada, puede que me esté esforzando demasiado para que mi código sea legible aquí!

    –James Bedford

    18 de agosto de 2011 a las 21:47

  • Hola James, intenté hacerlo de la manera que escribiste y mi programa se rompe. _crtheap 0x0083000 void * pUserData 0x0083c408 const void * ¿Por qué crees que sucede esto? Básicamente es un bloque de montón modificado más allá del tamaño solicitado, ¡algo así!

    – Rakshit Kothari

    26 de febrero de 2014 a las 1:09


  • @JamesBedford – Lo siento, no pude etiquetarte en el anterior.

    – Rakshit Kothari

    26 de febrero de 2014 a las 1:27

  • Solo para exponer más claramente lo que está sucediendo. También podría hacer que sea más fácil establecer un punto de interrupción y ver el valor del puntero que está a punto de liberarse, si eso es de interés para el desarrollador.

    –James Bedford

    23/03/2018 a las 17:00

Sí, debe recorrer ptr y libre cada uno ptr[i]. Para evitar pérdidas de memoria, la regla general es esta: para cada malloc()debe haber exactamente uno correspondiente free().

Sencillo

while (N) free(ptr[--N]);
free(ptr);

Guapo

#define FALSE 0
#define TRUE 1
typedef int BOOL;

void freev(void **ptr, int len, BOOL free_seg) {
    if (len < 0) while (*ptr) {free(*ptr); *ptr++ = NULL;}
    else while (len) {free(ptr[len]); ptr[len--] = NULL;}
    if (free_seg) free(ptr);
}

freev(ptr, N, TRUE); /* if known length */
freev(ptr, -1, TRUE); /* if NULL-terminated */
freev(ptr, -1, FALSE); /* to keep array */

Patricio

Fácil funciones:

Me resulta difícil hacer una programación seria en C sin GLib. Introduce cosas como cuerdas dinámicas y pone cimientos por programación funcional. Realmente debería ser parte de la biblioteca de tiempo de ejecución estándar de C. Le daría a C un soplo de aire fresco. Volvería a convertir a C en un lenguaje razonable y competitivo. para el año 2019. Pero debido a que no lo es, agregará 1 MB a su aplicación (ya sea en tamaño DLL o en tamaño ejecutable). También la distribución de Windows es mantenida por sádicos.

for(int i=0;i<N;i++) free(ptr[i]);
free(ptr);

no está comprobando si no se ha podido asignar malloc. Siempre debes revisar.

avatar de usuario
Asher Abecassis

void freeMatrix(int **matrix ,int row)
{
    for(int i=0;i<row;i++)
    {
        free(matrix[i]);
    }
    free(matrix);
}

¿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