【问题标题】:function to get 2d-arrays from stack and heap从堆栈和堆中获取二维数组的函数
【发布时间】: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


【解决方案1】:

如果您尝试在 c 或 c++ 中执行此操作:

 int test[][];

你会得到这个错误:

error: declaration of 'test' as multidimensional array must have bounds for all dimensions except the first

这是因为测试实际上并不像您所期望的那样双管齐下。但是编译器会将其转换为单个数据块。还有这个: int 测试[XSIZE][YSIZE]; int n = test[x][y];

会被转换成这样的:

int test[XSIZE*YSIZE];
n = test[YSIZE*x + y];

为了解决这个问题,我认为@BLUEPIXY 已经在 cmets 中提供了解决方案。 另外,请查看this question

【讨论】:

    猜你喜欢
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 2016-10-04
    相关资源
    最近更新 更多