作为参数传递的Realloc可变大小2D数组-C

问题描述 投票:1回答:1

首先,如果这是一个重复的问题,我想道歉。但是我找不到任何答案来解释如何使用可变大小的数组正确执行此操作。

直接进入代码,我已经明白了:

void f(int[][2]);

int main(void)
{
  int (*obsF)[2] = malloc(sizeof(int)); //I reserve some memory so I can pass 
  f(obsF);                              //the array to f, since I don't know
  free(obsF);                           //its size until later working with f. 
}

void f(int obsF[][2])
{
  obsF = realloc(obsF, sizeof(int[5][2])); //The 5 is just as an example.
  // do stuff with obsF                    //I won't know this number until
}                                          //later in f.

使用valgrind进行测试,结果表明free(obsF);是无效的free()。

现在,如果我也这样做,但主要功能中的所有内容都像这样:

int main(void)
{
  int (*obsF)[2] = malloc(sizeof(int));
  obsF = realloc(obsF, sizeof(int[5][2]));
  free(obsF);
}

Valgrind测试成功通过,没有错误。

我想知道为什么会这样,以及如何在函数内部重新分配2D数组,并能够正确地将其从main中释放出来。

只要我可以将obsF用作f内的2D数组并根据需要对其进行修改,然后在main中使用它,任何其他更好的方法或解决方案都会受到欢迎。

谢谢。-

c multidimensional-array malloc dynamic-memory-allocation realloc
1个回答
2
投票

C通过值而不是通过引用传递参数。当将obsF指针传递给f并重新分配它时,可以在obsF函数中更改f参数的值,但在main函数中更改变量(确定该参数的初始值)仍然保留旧指针,该指针已被重新分配无效。

要解决此问题,您可以将pointer传递给obsFf变量,并取消引用该指针以访问该变量:

void f(int **obsF)
{
  *obsF = realloc(*obsF, sizeof(int[5][2]));
  // do stuff with obsF
}

然后将f称为:

int main(void)
{
  int *obsF = malloc(sizeof(int));
  f(&obsF);
  free(obsF);
}

这样,在调用obsF之后,main中的f变量的值将被更新,并且正确的指针将被释放。

© www.soinside.com 2019 - 2024. All rights reserved.