在C中使用free()时出现无效(中止)内核转储错误

在C中使用free()时出现无效(中止)内核转储错误,c,pointers,free,C,Pointers,Free,代码如下: 有人能解释这个问题吗 如何在main中释放s的内存 char *get(int N) { char *s=malloc(10*sizeof(char)); s="hello"; return s; } int main() { char *s=get(4); printf(s); free(s); } 通过做 s="hello"; 您正在通过malloc()覆盖返回的指针,该指针指向字符串liter

代码如下: 有人能解释这个问题吗 如何在main中释放s的内存

char *get(int N)
{
    char *s=malloc(10*sizeof(char));  
    s="hello";  
    return s;  
}
 int main()  
{  
    char *s=get(4);  
    printf(s);  
    free(s);  
}
通过做

s="hello";
您正在通过
malloc()
覆盖返回的指针,该指针指向字符串literal
“hello”
的第一个元素,该元素不是动态分配的

接下来,将该指针(指向字符串文字)传递到
free()
,这将导致未定义的行为

您可能希望将作业更改为

strcpy(s, "hello");
此外,通过
malloc()
覆盖最初返回的指针,您没有机会释放内存-因此您也会导致内存泄漏。

s="hello";
您正在通过
malloc()
覆盖返回的指针,该指针指向字符串literal
“hello”
的第一个元素,该元素不是动态分配的

接下来,将该指针(指向字符串文字)传递到
free()
,这将导致未定义的行为

您可能希望将作业更改为

strcpy(s, "hello");
此外,通过
malloc()
覆盖最初返回的指针,您没有机会释放内存-因此也会导致内存泄漏。

这里:

s="hello";
不将
“hello”
写入分配的内存。相反,它会重新分配
s
以指向存储
“hello”
的只读位置。使用
malloc
分配的内存泄漏,
可用无效,因为无法释放该只读内存

如果要将
“hello”
复制到
s
,请尝试
strcpy(s,“hello”)

此处:

s="hello";
不将
“hello”
写入分配的内存。相反,它会重新分配
s
以指向存储
“hello”
的只读位置。使用
malloc
分配的内存泄漏,
可用无效,因为无法释放该只读内存


如果要将
“hello”
复制到
s
,请尝试
strcpy(s,“hello”)

这里有两个错误:

  • 您使用字符串文字“hello”的引用重新分配指针
    s
    ,从而失去了
    malloc

  • 您没有为“hello”字符串分配足够的空间。您至少需要6个字符(不是4个)


  • 这里有两个bug:

  • 您使用字符串文字“hello”的引用重新分配指针
    s
    ,从而失去了
    malloc

  • 您没有为“hello”字符串分配足够的空间。您至少需要6个字符(不是4个)


  • char*
    类型的变量是指向字符的指针(内存地址)。在C语言中,通常将字符串实现为以零结尾的字符数组,并通过对此类数组的第一个元素使用
    char*
    类型的变量来处理字符串

    这样一来,
    char*
    类型的变量实际上并不包含字符串,它们只是指向字符串

    因此,该行

    s=“你好”

    实际上并不复制字符串的内容,而是只复制字符串的指针(即内存地址)

    如果要复制字符串的实际内容,则必须使用函数


    通过覆盖用于存储由
    malloc
    分配的内存地址的指针,您将把字符串literal
    “hello”
    的地址传递给
    free
    。不应该这样做。您只能将从
    malloc
    接收的
    free
    内存地址传递给
    char*
    类型的变量是指向字符的指针(内存地址)。在C语言中,通常将字符串实现为以零结尾的字符数组,并通过对此类数组的第一个元素使用
    char*
    类型的变量来处理字符串

    这样一来,
    char*
    类型的变量实际上并不包含字符串,它们只是指向字符串

    因此,该行

    s=“你好”

    实际上并不复制字符串的内容,而是只复制字符串的指针(即内存地址)

    如果要复制字符串的实际内容,则必须使用函数


    通过覆盖用于存储由
    malloc
    分配的内存地址的指针,您将把字符串literal
    “hello”
    的地址传递给
    free
    。不应该这样做。您必须只将从
    malloc

    收到的
    free
    的内存地址传递给
    free
    ,您将
    s
    的指针值重新分配给一个静态字符串,而不是像您所想的那样将“hello”实际存储到malloc'ed内存中。因此,您正在释放未分配的内存
    strcpy(s,“hello”)
    char*s=get(6)
    将盐倒在上面@sshashank124调用的伤口上,您也在泄漏内存。@P_uj_uu如果
    N
    用于任何事情:-)您正在将
    s
    的指针值重新分配给一个静态字符串,而不是像您想象的那样将“hello”存储到malloc'内存中。因此,您正在释放未分配的内存
    strcpy(s,“hello”)
    char*s=get(6)在上面@sshashank124所说的伤口上撒盐,你也在泄漏内存。@P_uj_uu如果
    N
    被用于任何事情:-)不是挑剔,这段代码中的实际问题在别处,这是由另外两个答案指出的,在你的答案中缺失了。(1)问题不是重新分配,相反,将无效指针传递给free和(2)注意,此代码中没有使用参数值,因此第2点在这里不是有效的原因。@SouravGhosh否-它不在其他地方-主要问题是我的观点