Realloc 可变大小的二维数组作为参数传递 - C

Realloc variable sized 2D array passed as parameter - C

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

直接看代码,我有这个:

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 测试成功通过,没有错误。

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

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

谢谢。-

C 按值传递参数,而不是按引用传递。当您将 obsF 指针传递给 f 并重新分配它时,您更改了 f 函数中 obsF 参数的值,但 [=16= 中的变量] 函数(确定参数的初始值)仍然持有旧指针,该指针已因重新分配而失效。

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

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);
}

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