另一个功能的空闲内存

时间:2018-02-07 09:39:08

标签: 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);
}

以下是输出:

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?如果可以的话,最好的方法是什么?

4 个答案:

答案 0 :(得分:6)

您将覆盖后面一行中的指针值,使*str指向文字。

通过尝试free一个文字,你有一个内存泄漏未定义的行为。

你可能意味着

strcpy(*str,"hello");

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

*str = strdup("HELLO");

,其优点是为字符串分配确切的字节数而不是猜测。

答案 1 :(得分:1)

执行*str = "HELLO";时,它没有您期望的效果。您不是将值分配给已分配的内存,而是重新指定指向字符串文字的指针,因此稍后您尝试释放它(因此错误)。除此之外,您应该使用strcpy之类的strcpy(*str, "HELLO")

答案 2 :(得分:0)

要回答如何在没有明确字符串复制的情况下执行此操作的问题,而不是

char *p = "hello";

DO

char p[] = "hello";

第一点指向不可修改的内存部分。第二个分配一个足够大的数组来保存文字并将文字复制到其中。

答案 3 :(得分:0)

你正在改变malloc之后的内存地址指向str指针。你应该做strcpy而不是直接赋值:

#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);
    strcpy(*str,"HELLO");//*str = "HELLO";
    printf("str = %p\n",str);
    printf("&str = %p\n",&str);

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