用堆而不是堆栈在C中分配二维数组

我还没有意识到在C中堆栈分配是有区别的。我已经用堆栈分配数组编写了一个严重的大程序,但显然它们不足以存储读取的数据。 因此,我需要用malloc分配重写所有内容。 有没有一种聪明的方式如何将二维数组动态分配到堆中,以及它们在代码中的用法是否相似,以便分配堆栈,这意味着:

我的代码看起来像这样:

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); 当你完成。

你可以访问这个数组的元素并将其传递给一个函数,就像你现在正在做的一样。 它只是需要改变的初始分配线。

链接地址: http://www.djcxy.com/p/14127.html

上一篇: Allocating an 2D array in C in heap instead of stack

下一篇: What actually causes a Stack Overflow error?