在C中使用free()时出现无效(中止)内核转储错误
代码如下: 有人能解释这个问题吗 如何在main中释放s的内存在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
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否-它不在其他地方-主要问题是我的观点