c - 使用引用传递时,如何释放调用函数中分配的内存

标签 c memory-management malloc

所以我有这样的代码,其中分配发生在一个函数中,释放正在调用函数中完成。尝试通过 ptr 或 *ptr 释放内存时出现段错误或中止消息。请看一下:

#include <stdio.h>

int main()
{

    char *ptr;
    fun(&ptr);
    printf("ptr = %p\n",ptr);
    printf("&ptr = %p\n",&ptr);
    printf("String ptr = %s\n",ptr);
    free (ptr);

    return 0;
}
void fun(char **str)
{
    *str = malloc(10);
    *str = "HELLO";
    printf("str = %p\n",str);
    printf("&str = %p\n",&str);

    printf("String str = %s\n",*str);
}

以下是输出:

str = 0x7ffe63247858                                                                                                                 
&str = 0x7ffe63247838                                                                                                                
String str = HELLO                                                                                                                   
ptr = 0x400764                                                                                                                       
&ptr = 0x7ffe63247858                                                                                                                
String ptr = HELLO                                                                                                                   
*** Error in `/home/a.out': munmap_chunk(): invalid pointer: 0x0000000000400764 ***                                                  
Aborted  

问题:

为什么我们不能释放 ptr ?如果可以的话,最好的方法是什么?

最佳答案

问题在于指针变量是按值传递的。您需要通过将指针传递给指针模拟指针的值传递。使用地址运算符 & 来获取它。

还有第二个问题,那就是函数内指针的重新分配。首先分配内存并使 str 指向该内存。然后,您直接重新分配指针并使其指向其他位置,从而丢失已分配的内存。您需要copy将字符串放入分配的内存中。

关于c - 使用引用传递时,如何释放调用函数中分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48317002/

相关文章:

c++ - mingw64-gcc 上的可变参数可能存在错误

ios - 在 UITableView 中显示大图像的内存问题

objective-c - C 和 Objective-C - 释放无符号字符指针的正确方法

c - malloc 可以分配的最大内存

c - realloc:下一个大小无效错误,任何人都可以指出我在内存分配中犯的错误

c++ - 如何使用 OpenCv 叠加图像?

c - PIC(或类似产品)编程入门

c - matlab中c函数返回值错误

c++ - 是否可以在其范围之外访问局部变量的内存?

iphone - iOS NSDictionary 复制内存泄漏