用堆而不是堆栈在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