另一个功能的空闲内存

Man*_*noj 0 c 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);
}
Run Code Online (Sandbox Code Playgroud)

以下是输出:

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  
Run Code Online (Sandbox Code Playgroud)

题 :

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

Jea*_*bre 6

你在后面的行中覆盖指针值,*str指向一个文字.

因此,尝试使用文字时,会出现内存泄漏未定义的行为free.

你可能意味着

strcpy(*str,"hello");
Run Code Online (Sandbox Code Playgroud)

请注意,这两行可以更改为工作单行,如下所示:

*str = strdup("HELLO");
Run Code Online (Sandbox Code Playgroud)

这有利于为字符串分配确切的字节数而不是猜测.