在 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");
。
这里有两个错误:
您使用字符串文字 "hello" 的引用重新分配指针 s
,失去由 malloc
[=21 分配的内存=]
您为 "hello" 字符串分配的 space 不足。您至少需要 6 个字符(不是 4 个)
char *
类型的变量是指向字符的指针(内存地址)。在 C 语言中,通常将字符串实现为零终止字符数组,并通过使用 char *
类型的变量到此类数组的第一个元素来处理字符串。
这样,char *
类型的变量实际上并不包含字符串,它们只是指向它们。
因此,行
s="hello";
实际上并不复制字符串的内容,而只是复制字符串的指针(即内存地址)。
如果要复制字符串的实际内容,必须改用函数strcpy。
通过覆盖用于存储由 malloc
分配的内存地址的指针,您实际上是将字符串文字 "hello"
的地址传递给 free
。不应该这样做。您必须只将内存地址传递给从 malloc
.
收到的 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";
您正在用指向字符串文字 "hello"
的第一个元素的指针覆盖 malloc()
返回的指针,它不是动态分配的。
接下来,您将该指针(指向字符串文字)传递给 free()
,这会导致未定义的行为。
您可能希望将作业更改为
strcpy(s, "hello");
此外,通过 malloc()
覆盖最初返回的指针,您没有机会释放内存 - 因此也会导致内存泄漏。
这里是:
s="hello";
不将 "hello"
写入分配的内存。相反,它重新分配 s
以指向存储 "hello"
的只读位置。您使用 malloc
分配的内存已泄漏,并且 free(s);
无效,因为您无法释放该只读内存。
如果您想将 "hello"
复制到 s
,请尝试 strcpy(s,"hello");
。
这里有两个错误:
您使用字符串文字 "hello" 的引用重新分配指针
[=21 分配的内存=]s
,失去由malloc
您为 "hello" 字符串分配的 space 不足。您至少需要 6 个字符(不是 4 个)
char *
类型的变量是指向字符的指针(内存地址)。在 C 语言中,通常将字符串实现为零终止字符数组,并通过使用 char *
类型的变量到此类数组的第一个元素来处理字符串。
这样,char *
类型的变量实际上并不包含字符串,它们只是指向它们。
因此,行
s="hello";
实际上并不复制字符串的内容,而只是复制字符串的指针(即内存地址)。
如果要复制字符串的实际内容,必须改用函数strcpy。
通过覆盖用于存储由 malloc
分配的内存地址的指针,您实际上是将字符串文字 "hello"
的地址传递给 free
。不应该这样做。您必须只将内存地址传递给从 malloc
.
free