在递归中使用 realloc
我可以用 C 语言做这个吗? Valgrind 抱怨 realloc 产生无效的 free?
int main(){
void* mem;
// Do stuff
recurfunc(123, mem);
// Do stuff
if(mem)
free(mem);
return 0;
}
void recurfunc(int x, void* mem){
.....
// Do stuff
mem = realloc(mem, newsize);
// Do stuff
recurfunc(x, mem);
.....
}
Can I do this in C? Valgrind complains that realloc produces an invalid free?
int main(){
void* mem;
// Do stuff
recurfunc(123, mem);
// Do stuff
if(mem)
free(mem);
return 0;
}
void recurfunc(int x, void* mem){
.....
// Do stuff
mem = realloc(mem, newsize);
// Do stuff
recurfunc(x, mem);
.....
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
是的,它确实会抱怨,因为您作为
mem
传入的void *
是指针的副本。对函数内指针的更改将不会反映回main
。如果您想更改函数中的
mem
并使其反射回来,则需要将指针传递给指针。以下代码说明了这一点:
which 输出:
并且您可以看到第一个值在
main
中保留,尽管它在函数内发生了更改。Yes, it does indeed complain, because the
void *
you're passing in asmem
is a copy of the pointer. Changes to the pointer within the function will not be reflected back tomain
.If you want to change
mem
in the function and have it reflected back, you need to pass a pointer to a pointer.The following code illustrates this:
which outputs:
and you can see that the first value is retained in
main
despite it being changed within the function.任何使用的代码
都可能泄漏,除非其他一些变量也保存
x
的当前值。原因是,如果重新分配失败,返回值为 NULL,因此当前“未调整大小”的内存块将丢失。
此外,在您的代码中,您将
main
看到的变量,,所以无论您的代码中发生了什么代码是“未定义的行为”。
Any code that uses
is potentially leaking unless also some other variable holds the current value of
x
.The reason is that if reallocation fails the return value is
NULL
so the current "unresized" memory block is lost.In your code moreover you are
main
So no matter what happens in your code is "undefined behaviour".