我没有意识到C中的堆栈和堆分配之间有区别。我已经用堆栈分配的数组编写了一个非常大的程序,但显然它们不够大,无法存储读取的数据。因此,我需要用malloc分配重写所有内容。有没有一种聪明的方法可以将2D数组动态分配给堆,并且它们在代码中的使用类似于堆栈分配,这意味着:
我的代码看起来像这样:
int MM,NN;
float Edge[MM][NN];
Do_Something(MM,NN,Edge);
被调用的过程定义为:
void Do_Something(int MM,int NN,float Edge[MM][NN]);
我需要用malloc重写所有内容,以便这些定义仍然有效。这可能吗?
是,使用指向数组的指针:
int (*pa)[x] = malloc( sizeof(*pa) * y ) ;
其中x和y是内部尺寸和外部尺寸。这在用法上类似于int pa[y][x]
。您可以在函数中使用此指针。
理论上,您的代码没有任何问题。C标准表示可以。
然而,在实践中,常见的实现只为堆栈变量留出相对较小的空间,并且不进行任何溢出检查。编译器很容易将数组存储在调用堆栈之外的其他地方,或者增加堆栈的大小;然而,常见的编译器却不能做到这一点;他们希望您手动请求这样的东西。
您可以通过写以下内容来强制进行堆分配:
float (*Edge)[NN] = malloc(MM * sizeof *Edge);
如果您不熟悉这个malloc习语,请参阅此处。当然,你必须确保完成free(Edge);
。
您可以访问这个数组的元素,并以与当前相同的方式将其传递给函数;这只是需要更改的初始分配行。