aula 206

Como liberar a memória de uma matriz dinâmica com a função free?

Nas aulas anteriores vimos que basta usar a função free() para liberar a memória alocada dinamicamente. Porém, há uma pegadinha quando estamos falando de uma matriz dinâmica. Na aula de hoje vamos aprender como liberar a memória de uma matriz dinâmica com a função free().

Aprendemos nas aulas anteriores que uma matriz alocada dinamicamente é um vetor de vetores. Isso implica que sua alocação é feita em duas etapas. Primeiro alocamos um vetor cujo tamanho é a quantidade de linhas da matriz desejada. Em seguida, alocamos um novo vetor para cada posição do primeiro vetor, por isso um vetor de vetores.

Como a alocação de memória é feita em duas etapas, a liberação da memória também é feita em duas etapas.

Primeiro precisamos liberar cada linha da nossa matriz dinâmica para depois liberar o vetor que guardava os endereços das linhas, assim:

    // liberando a memória alocada para a matriz
    for(i = 0; i < 5; i++)
        free(mat[i]); // libera cada uma das linhas
    free(mat); // libera o vetor inicial com os ponteiros para as linhas

Código de exemplo completo em C para alocar e liberar memória de uma matriz

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

/*
            Aula 206: Como liberar a memória de uma matriz dinâmica?

            Código escrito por Wagner Gaspar
            Junho de 2021
*/

int main(){

    int **mat, i, j;

    // alocando um vetor de ponteiros (vetor de vetores)
    mat = malloc(5 * sizeof(int*));

    // alocando um vetor para cada posição do vetor anterior
    for(i = 0; i < 5; i++)
        mat[i] = malloc(5 * sizeof(int));

    srand(time(NULL));

    // gerando números e preenchendo a matriz
    for(i = 0; i < 5; i++){
        for(j = 0; j < 5; j++)
            *(*(mat + i) + j) = rand() % 100;
    }

    // imprimindo a matriz no terminal
    for(i = 0; i < 5; i++){
        for(j = 0; j < 5; j++)
            printf("%2d ", *(*(mat + i) + j));
        printf("\n");
    }

    // liberando a memória alocada para a matriz
    for(i = 0; i < 5; i++)
        free(mat[i]); // libera cada uma das linhas
    free(mat); // libera o vetor inicial com os ponteiros para as linhas

    return 0;
}

Deixe um comentário

onze − sete =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.