【发布时间】: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