Свободная динамическая двумерная матрица на С

Я сделал код, который выделяет 2 int матрицы и освобождает в конце, после использования. Когда я отключаю первую матрицу, она работает нормально. Во вторых ошибка:

munmap_chunk (): неверный указатель: 0x0829a068 ***Abortado (imagem do núcleo gravada)

Я не могу найти, где ошибка.

#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;
}

2 ответа

Решение

Проверьте возвращение malloc, чтобы увидеть, если это удалось или не удалось.

#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;
}

Если у вас есть двумерный массив, у вас есть указатель на указатель. Чтобы освободить память, выделенную этому массиву, вам необходимо освободить вторичные массивы перед первым массивом. Сделай это так...

int **array;
int size1 = sizeof(array)/sizeof(array[0]);
for(int i=0; i<size1; i++) {
    free(array[i]);
}
free(array);

Вы также должны знать, что после завершения программы вся выделенная память автоматически освобождается.

Вы можете динамически выделить массив, выполнив это...

array = malloc(size1 * sizeof(int*));
    for (int i = 0; i < size1; i++) {
            array[i] = malloc(size2 * sizeof(int));
    }

Это должно дать массив, к которому можно получить доступ следующим образом...

array[0-size1][0-size2];

Другие вопросы по тегам