【问题标题】:Realloc variable sized 2D array passed as parameter - CRealloc 可变大小的 2D 数组作为参数传递 - C
【发布时间】:2020-03-27 13:37:30
【问题描述】:

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

直接看代码,我有这个:

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 作为二维数组并根据需要对其进行修改,然后在 main 中使用它。

谢谢。-

【问题讨论】:

  • 在 C 中,所有函数参数都按值传递。所以obsF = realloc() 不会改变调用者的指针值,因此main 中的free 调用在一个已经释放的指针上运行。
  • 请注意,您可以分配一个空指针来传递给realloc
  • @kaylum 我知道当将数组作为参数传递时,C 将它们视为指针。所以我以为我正在研究同一个指针。
  • 正在寻找更好的 dup,但现在有一个:stackoverflow.com/questions/25204576/…
  • 它是相同的,但不是同一个变量。 obsF = realloc(obsF, sizeof(int[5][2])); 覆盖参数,然后将其丢弃,留下内存泄漏,然后您尝试 free 已释放的内容(不是泄漏)。

标签: c multidimensional-array malloc dynamic-memory-allocation realloc


【解决方案1】:

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

要解决此问题,您可以将 指针 传递给 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 后更新,并释放正确的指针。

【讨论】:

  • 如何编写 f 的原型的正确方法?因为我无法让它工作。
  • 我将示例更改为使用普通的int * 而不是int (*)[][];现在应该可以编译了。
  • 我没看到。非常感谢。然后我可以将数组转换为二维数组,并释放旧数组,因为这是我的程序需要处理的。你帮我解决了我的问题。-
猜你喜欢
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 2012-10-01
  • 2021-10-31
  • 2017-07-26
  • 2016-03-27
相关资源
最近更新 更多