【问题标题】:Allocating an 2D array in C in heap instead of stack在堆而不是堆栈中分配 C 中的二维数组
【发布时间】:2014-11-11 23:13:18
【问题描述】:

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

【问题讨论】:

  • float (*Edge)[NN] = malloc(sizeof(float[MM][NN]));
  • @BLUEPIXY 你为什么在 cmets 中回答? (只是好奇)
  • @2501 回答不够。我似乎足以发表评论。

标签: c arrays memory-management malloc


【解决方案1】:

是的,使用指向数组的指针:

int (*pa)[x] = malloc( sizeof(*pa) * y ) ;

其中 x 和 y 是内部和外部尺寸。这与int pa[y][x] 的用法相似。你可以在你的函数中使用这个指针。

【讨论】:

  • 我按照你的建议做了,我把所有的定义都从 int pa[x][y];到 int (*pa)[x] = malloc( sizeof(*pa) * y ) ;但是,我的代码无法正常工作。索引有区别吗?内存分配的区别?
  • 我想通了。错误是由于解除分配造成的。
【解决方案2】:

理论上,您的代码没有任何问题。 C 标准说没问题。

但是,在实践中,常见的实现只为堆栈变量留出相对较小的空间,并且它们不进行任何溢出检查。编译器很容易将您的数组存储在调用堆栈之外的其他位置,或者增加该堆栈的大小;但是普通的编译器不会那样做;他们希望您手动请求此类内容。

您可以改为强制堆分配:

float (*Edge)[NN] = malloc(MM * sizeof *Edge);

如果你不熟悉这个 malloc 习语,那么see here。当然,您必须确保在完成后执行free(Edge);

您可以访问此数组的元素并将其传递给函数,就像您当前所做的一样;只有初始分配线需要改变。

【讨论】:

    猜你喜欢
    • 2014-05-13
    • 2015-08-05
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多