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

Invalid (Aborted)core dumped error while using free() in C

代码如下: 谁能解释这个问题 我怎样才能在 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";

您正在用指向字符串文字 "hello" 的第一个元素的指针覆盖 malloc() 返回的指针,它不是动态分配的。

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

您可能希望将作业更改为

strcpy(s, "hello");

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

这里是:

s="hello";

不将 "hello" 写入分配的内存。相反,它重新分配 s 以指向存储 "hello" 的只读位置。您使用 malloc 分配的内存已泄漏,并且 free(s); 无效,因为您无法释放该只读内存。

如果您想将 "hello" 复制到 s,请尝试 strcpy(s,"hello");

这里有两个错误:

  1. 您使用字符串文字 "hello" 的引用重新分配指针 s,失去由 malloc

    [=21 分配的内存=]
  2. 您为 "hello" 字符串分配的 space 不足。您至少需要 6 个字符(不是 4 个)

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

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

因此,行

s="hello";

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

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

通过覆盖用于存储由 malloc 分配的内存地址的指针,您实际上是将字符串文字 "hello" 的地址传递给 free。不应该这样做。您必须只将内存地址传递给从 malloc.

收到的 free