我发现程序中的错误,并决定编写一个简单的错误,这将有助于我了解正在发生的事情。这是:
#include <stdio.h>
#include <stdlib.h>
char * first()
{
char * word = malloc(sizeof(char) * 10);
word[0] = 'a';
word[1] = 'b';
word[2] = '\0';
return word;
}
char * second ()
{
char * word = malloc(sizeof(char) * 10);
word = "ab";
return word;
}
int main ()
{
char * out = first();
printf("%s", out);
free(out);
out = second();
printf("%s", out);
free(out);
return 0;
}
first()
功能正常运行,但second()
(完全是free(out)
)会产生错误:
<。> ./a.out'中的错误:munmap_chunk():无效指针:0x0000000000400714 *** ababAborted(核心倾销)
我不明白为什么第一个功能是正确的,但第二个功能不正确。谁能解释为什么?
答案 0 :(得分:31)
在函数second()
中,赋值word = "ab";
会为word
指定一个新指针,覆盖通过malloc()
获得的指针。当您稍后在指针上调用free()
时,程序会崩溃,因为您将指针传递给free()
,但尚未通过malloc()
获取。
分配字符串文字无法像您想象的那样复制其内容。要复制字符串文字的内容,请使用strcpy()
:
strcpy(word, "ab");
答案 1 :(得分:10)
在函数char * second
char * word = malloc(sizeof(char) * 10);
word = "ab";
第二个语句word = "ab";
将word
更改为指向远离已分配的内存。您不是将字符串"ab"
复制到malloc
分配的堆区域。 / p>
对于free
,未由malloc
或类似功能分配的内存会导致程序崩溃。
尝试释放无效指针(指向未由calloc,malloc或realloc分配的内存块的指针)可能会影响后续分配请求并导致错误。
你应该在这里strcpy
使用其他人的建议。