正确的方法来释放m * n矩阵二维分配

时间:2014-06-12 23:47:12

标签: c matrix

我以这种方式分配非方矩阵,但我不确定我是否正确使用了解除分配

float **matrix_alloc(int m /* rows */, int n /* columns */)
{
    int i;
    float **arr = malloc(m*sizeof(*arr));
    for(i=0; i<m; i++)
    {
        arr[i]=malloc(n*sizeof(**arr));
    }
    return arr;
}

我尝试过两种释放内存的方法

-Attempt A 循环

void free_mem_mat(int m, float **array) {
    int i;
    for (i = 0; i < m; i++) {
        free(array[i]);
    }
    free(array);
}

- 尝试B 循环

void free_mem_mat(int n, float **array) {
    int i;
    for (i = 0; i < n; i++) {
        free(array[i]);
    }
    free(array);
}

我应该用什么来免费?行 A 的方式 B ? (我知道写的方法是一样的,我已经重写了这个最明显的可能)

3 个答案:

答案 0 :(得分:3)

每个free() * 需要一个malloc()m+1malloc()次来电;您最好m+1拨打free()

鉴于作为起点,选项A是正确的解决方案。但是,值得注意的是,只要将给定分配函数的m维度作为释放函数的大小参数传递,两个函数(选项A和选项B)就完全等效。备选方案B中的评论具有误导性;你没有在列上循环。

假设:

enum { MAT_ROWS = 20, MAT_COLS = 30 };
float **matrix = matrix_alloc(MAT_ROWS, MAT_COLS);

free_mem_mat()的正确调用是:

free_mem_mat(MAT_ROWS, matrix);

*如果您使用realloc()calloc(),这是一个过于简化的陈述。对于不是free()&d; d的每个malloc(),您需要realloc(),而对于没有free()的每个realloc(),您需要free() calloc() 1}} - 将大小设置为0.就malloc()而言,free()等同于{{1}}。

答案 1 :(得分:1)

问题在于它有很多分配

我更喜欢这种模式

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

float **matrix_alloc(int m /* rows */, int n /* columns */)
{
        int i;

        float **arr = malloc(m * sizeof(float *));
        *(arr) = malloc(m * n * sizeof(float));

        for (i = 0; i < m; i++) {
                *(arr + i) = (*(arr) + i * n);
        }

        return arr;
}

void free_mem_mat(float **array) {
        free(*(array));
        free(array);
}

int main () {

        float **matrix = matrix_alloc(10, 20);
        free_mem_mat(matrix);

        return 0;
}

更多信息: http://c-faq.com/aryptr/dynmuldimary.html

答案 2 :(得分:0)

arr被分配为m个元素的数组,每个元素都指向一些已分配的内存。因此,您必须释放arr中的m个指针。在释放每个东西时,你不需要提到指向的东西的大小。

相关问题