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



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

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

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

其中x和y是内部尺寸和外部尺寸。这在用法上类似于int pa[y][x]。您可以在函数中使用此指针。

理论上,您的代码没有任何问题。C标准表示可以。

然而,在实践中,常见的实现只为堆栈变量留出相对较小的空间,并且不进行任何溢出检查。编译器很容易将数组存储在调用堆栈之外的其他地方,或者增加堆栈的大小;然而,常见的编译器却不能做到这一点;他们希望您手动请求这样的东西。

您可以通过写以下内容来强制进行堆分配:

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

如果您不熟悉这个malloc习语,请参阅此处。当然,你必须确保完成free(Edge);

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

相关内容

  • 没有找到相关文章

最新更新