请耐心等待,因为这可能是一个非常简单的问题,但我对C.很新。 我试图malloc一个特定的数组,然后释放它。但是,行:
M = malloc(N*sizeof(double *));
......不起作用。有人可以向我解释为什么这不起作用,解决方案是什么?非常感谢提前。
答案 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);
当然,如果你对自己有把握,那么我建议你学习调试器。