c - 在递归中使用 realloc

标签 c memory-leaks recursion 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);
     .....
}

最佳答案

是的,它确实会提示,因为您作为 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/

相关文章:

SQL 递归与 row_numbers

c - 预测C代码的输出

我可以调用另一个函数中编写的函数吗?

c - 为什么 b 数组不复制整个 a 数组?

c - 从文件中获取第三行作为字符串(不带新行)

尽管堆大小相当一致,node.js RSS 内存会随着时间增长

c++ - 我如何找到 Win32 中的资源泄漏?

list - LISP中列表元素的递归处理

android-studio - Android Studio Memory Profiler 中的 "total count"指标是什么?

python - 如何减少递归函数定义中所需的参数(用于计算a*b)