1 c recursion memory-leaks realloc
我可以在C中这样做吗?Valgrind抱怨realloc产生无效免费?
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);
.....
}
Run Code Online (Sandbox Code Playgroud)
是的,它确实抱怨,因为void *你传入的mem是指针的副本.对函数内指针的更改不会反映回来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;
}
Run Code Online (Sandbox Code Playgroud)
哪个输出:
Before call: 0x896f008 0x896f070
In call: 0x896f0d8 0x896f1a8
After call: 0x896f008 0x896f1a8
^
+--- Note this bit.
Run Code Online (Sandbox Code Playgroud)
并且您可以看到第一个值保留在main函数中,尽管它已被更改.