在C中释放二维数组

时间:2014-04-28 13:56:28

标签: c malloc free multidimensional-array

请耐心等待,因为这可能是一个非常简单的问题,但我对C.很新。 我试图malloc一个特定的数组,然后释放它。但是,行:

    M = malloc(N*sizeof(double *));

......不起作用。有人可以向我解释为什么这不起作用,解决方案是什么?非常感谢提前。

1 个答案:

答案 0 :(得分:2)

你应该释放所有位置,而不仅仅是第一位。参见我写过的this示例。

正如@Grijesh所说,分配也是错误的。该示例也涵盖了分配。而且,我建议你不要再转换malloc(more)。

您必须将2D数组视为一维数组,其中每个单元都是指向一维数组的指针。图片可能会有所帮助: http://gsamaras.files.wordpress.com/2014/04/array2d-n.png 这里,保存指针的1D数组位于左侧,每个单元格指向另一个1D数组。 左边有多少个1D阵列?和左边数组中一样多的单元格。

Btw,Nelly我认为这不是一个愚蠢的问题,它会让初学者陷入麻烦之中。 ;)

编辑: 关于你的新代码,你必须对matrix_free有相同的定义和声明,以及你应该调用它。什么定义等等? Answer

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

#define Nmax 9000

double **makeMatrix(int N);
void free_matrix(double **M,int N);

int main(void) {
    int N;

    for (N = 2; N < Nmax; N *= 2) {
        double **L = makeMatrix(N);
        printf("yes \n");
        free_matrix(L, N);
        printf("woo \n");
    }
    return 0;
}

double **makeMatrix(int N) {
    int i, j;
    double **M;

    M = malloc(N * sizeof(double *));
    for (i = 0; i < N; i++)
        M[i] = malloc(N * sizeof(double));

    for (i = 1; i < N; i++) {
        for (j = 1; j < N; j++) {
            M[i][j] = (i) * (j) * M_PI / N;
        }
    }

    return (M);
}

void free_matrix(double **M, int N) {
    int i;
    for (i = 1; i <= N; i++) {
        free(M[i]);
    }
    free(M);
}

然后我收到你的输出。 :)但是,它会在某个时刻停止,因为NMAX太大了!不仅NMAX太大,而且N增长得非常快(N *=)。你在一张纸上做过数学计算吗?数字太大了。例如,如果我N +=,那么,我可以直到NMAX = 9000调试提示: 我怎么知道它到达哪个循环? 我打印出循环的计数器,就像这样

printf("woo %d\n",N);

当然,如果你对自己有把握,那么我建议你学习调试器。