我还没有意识到在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重写所有内容,以便这些定义仍然有效。这可能吗?
答案 0 :(得分:2)
是的,使用指向数组的指针:
int (*pa)[x] = malloc( sizeof(*pa) * y ) ;
其中x和y是内部和外部尺寸。这与int pa[y][x]
的用法类似。您可以在函数中使用此指针。
答案 1 :(得分:1)
理论上,您的代码没有任何问题。 C标准说没关系。
然而,在实践中,常见的实现仅为堆栈变量留出了相对较小的空间,并且它们不进行任何溢出检查。编译器很容易将数组存储在除调用堆栈之外的其他位置,或者增加该堆栈的大小;然而,常见的编译器并不是这样做的;他们希望你手动请求这些东西。
您可以通过编写来强制堆分配:
float (*Edge)[NN] = malloc(MM * sizeof *Edge);
如果你不熟悉这个malloc习语,那么see here。当然,你必须确保在完成后free(Edge);
。{/ p>
您可以访问此数组的元素,并以与您当前相同的方式将其传递给函数;它只是需要改变的初始分配线。