首页 > 解决方案 > Realloc 可变大小的 2D 数组作为参数传递 - 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 中释放出来。

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

谢谢。-

标签: cmultidimensional-arraymallocdynamic-memory-allocationrealloc

解决方案


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

要解决此问题,您可以将指向变量的指针传递给并取消引用该指针以访问该变量: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并释放正确的指针。


推荐阅读