我可以在 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);
.....
}
最佳答案
是的,它确实会提示,因为您作为 mem
传入的 void *
是指针的副本。对函数内指针的更改不会反射(reflect)回 main
。
如果你想在函数中改变mem
并让它反射回来,你需要传递一个指向指针的指针。
下面的代码说明了这一点:
#include <stdio.h>
#include <stdlib.h>
static void fn (void *p1, void **p2) {
p1 = realloc(p1, 200);
*p2 = realloc (*p2, 200);
printf (" In call: %p %p\n", p1, *p2);
}
int main (void) {
void *x1 = malloc (100);
void *x2 = malloc (100);
printf ("Before call: %p %p\n", x1, x2);
fn (x1, &x2);
printf (" After call: %p %p\n", x1, x2);
return 0;
}
哪些输出:
Before call: 0x896f008 0x896f070
In call: 0x896f0d8 0x896f1a8
After call: 0x896f008 0x896f1a8
^
+--- Note this bit.
您可以看到第一个值在 main
中保留,尽管它在函数中发生了更改。
关于c - 在递归中使用 realloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7480719/