在堆中分配C中的2D数组而不是堆栈

时间:2014-11-11 23:13:19

标签: c arrays memory-management malloc

我还没有意识到在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重写所有内容,以便这些定义仍然有效。这可能吗?

2 个答案:

答案 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>

您可以访问此数组的元素,并以与您当前相同的方式将其传递给函数;它只是需要改变的初始分配线。