在递归中使用realloc

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)

pax*_*blo 9

是的,它确实抱怨,因为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函数中,尽管它已被更改.