Search code examples
cmatrixmallocfree

Free dynamic bidimensional matrix in C


I made a code which allocs 2 int matrices, and frees in the end, after use. When I disalloc the first matrix, it works fine. In the second, the error:

munmap_chunk(): invalid pointer: 0x0829a068 ***Abortado (imagem do núcleo gravada)

I can't find where the error is.

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

int **AlocaMatriz (int linha, int coluna) {
    int **m, i, j;

    m = (int **) malloc (linha * sizeof(int *));

    for (i = 0; i < linha; i++) {
        m[i] = (int *) malloc (coluna * sizeof(int ));
    }

    /*inicializa matriz*/
    for (i = 0; i < linha; i++) {
        for (j = 0; j < coluna; j++) {
            m[i][j] = 0;
        }
    }

    return(m);
}

int **DesalocaMatriz (int linha, int coluna, int** m) {
    int i;
    for (i = 0; i < linha; i++) {
        free (m[i]);
    }
    free (m);
    return(NULL);
}

int main() {

    int i, j, numLinhas, numColunas, numInstancias, **matriz, **somas, resultado = 0;

    scanf("%d", &numInstancias);

    while (numInstancias > 0) {

        scanf("%d %d", &numLinhas, &numColunas);

        matriz = AlocaMatriz(numLinhas, numColunas);
        somas = AlocaMatriz(numLinhas, numColunas);

        //some operations on both matrices

        DesalocaMatriz(numLinhas, numColunas, matriz);
        DesalocaMatriz(numLinhas, numColunas, somas);
        numInstancias--;
    }

    return 0;
}

Solution

  • check the return of malloc to see if it succeeded or failed.

    #include <stdio.h>
    #include <stdlib.h>
    
    int **AlocaMatriz (int linha, int coluna) {
        int **m = NULL, i, j;
    
        if ( ( m = malloc (linha * sizeof(int *))) != NULL) {//not NULL is success
    
            for (i = 0; i < linha; i++) {
                if ( ( m[i] = malloc (coluna * sizeof(int ))) == NULL) {//NULL is failure
                    while ( i) {//free allocated so far
                        i--;
                        free ( m[i]);
                    }
                    free ( m);
                    return NULL;
                }
            }
    
            /*inicializa matriz*/
            for (i = 0; i < linha; i++) {
                for (j = 0; j < coluna; j++) {
                    m[i][j] = 0;
                }
            }
        }
    
        return(m);
    }
    
    int **DesalocaMatriz (int linha, int coluna, int** m) {
        int i;
        for (i = 0; i < linha; i++) {
            free (m[i]);
        }
        free (m);
        return(NULL);
    }
    
    int main() {
    
        int i, j, numLinhas, numColunas, numInstancias, **matriz, **somas, resultado = 0;
    
        scanf("%d", &numInstancias);
    
        while (numInstancias > 0) {
    
            scanf("%d %d", &numLinhas, &numColunas);
    
            matriz = AlocaMatriz(numLinhas, numColunas);
            somas = AlocaMatriz(numLinhas, numColunas);
    
            //some operations on both matrix
    
            if ( matriz) {//if not NULL
                DesalocaMatriz(numLinhas, numColunas, matriz);
            }
            if ( somas) {//if not NULL
                DesalocaMatriz(numLinhas, numColunas, somas);
            }
            numInstancias--;
        }
        return 0;
    }