【发布时间】:2015-06-12 19:08:14
【问题描述】:
考虑一个简单的结构,Foo,它包含一个指向其他结构的指针,Baz。和一个二维数组,(堆栈分配):Foo arr[ARR_SIZE][ARR_SIZE];
接下来,考虑一个函数,它mallocs(显然在堆中)为Foos 的新二维数组提供内存。一码sn-p:
Foo** arr_copy = malloc(sizeof(Foo*) * ARR_SIZE);
for (int i = 0; i < ARR_SIZE; i++)
{
arr_copy[i] = malloc(sizeof(Foo) * ARR_SIZE);
}
for (int i = 0; i < ARR_SIZE; i++)
{
for (int j = 0; j < ARR_SIZE; j++)
{
arr_copy[i][j].baz = malloc_baz();
}
}
现在,在我的项目中,我有各种需要处理原始数组(堆栈分配)和副本(堆分配)的函数
问题是,当我将副本传递给某个迭代二维数组并打印一些信息的函数时,事情变得古怪(内存看起来已损坏)。
基本上,我知道:void fun(Foo** arr) 和 void fun(Foo arr[ARR_SIZE][ARR_SIZE]) 之间不应该有区别,但两种方式都有问题。
所以我的问题是,一个函数如何处理两个数组,堆栈/堆分配?
谢谢。
【问题讨论】:
-
函数不关心数组位置(除非它们是由这些函数分配的)。这对他们来说都是记忆。
-
设为
Foo (*arr_copy)[ARR_SIZE] = malloc(sizeof(*arr_copy) * ARR_SIZE); -
@BLUEPIXY,你能解释一下这两个
mallocs 之间的区别吗? -
不同的内存映像。
-
你能扩展你的答案吗?
标签: c arrays memory memory-management malloc