c - 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 中使用它。
谢谢。-
解决方案
C 通过值而不是引用传递参数。当您将obsF
指针传递给f
并重新分配它时,您会更改函数中obsF
参数的值f
,但函数中的变量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);
}
这样,obsF
内部变量的值main
将在调用后更新f
并释放正确的指针。
推荐阅读
- javascript - 如何使用两个数组将复选框的值设置为 true?
- javascript - Windows 版 Safari 浏览器是否支持 ECMAScript 2016(ECMAScript 7)?
- apache-flink - 按时间属性窗口并推送到流
- java - Java Sprint-Boot:无法访问@Configuration 中定义的@Bean
- git - 如何在 SmartGit 中克隆一个简单的 HTTPS 存储库?
- python - Python POST 字符串数据
- python - 即使我没有给出气流的上游或下游,任务也会出现
- excel - 使用 groovy 脚本比较两个肥皂响应
- android - 在 Android 应用冷启动时,阻止网络请求,直到 VPN 启动
- javascript - 为什么 Vue `@click="click"` 和 `@click="click()"` 的工作方式相同?