我发现了我的程序中的错误,并决定写一个简单的错误,这将帮助我理解正在发生的事情。下面是:
#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 (内核转储)
我不明白为什么第一个函数是正确的,但是第二个功能不正确。有人能解释为什么吗?
发布于 2015-08-20 12:45:11
在函数second()中,赋值word = "ab";为word分配一个新指针,覆盖通过malloc()获得的指针。稍后在指针上调用free()时,程序会崩溃,因为您将一个指向free()的指针传递给未通过malloc()获得的指针。
分配字符串文本不会像您想的那样复制它们的内容。若要复制字符串文本的内容,请使用strcpy()
strcpy(word, "ab");发布于 2015-08-20 12:49:35
在函数char * second中
char * word = malloc(sizeof(char) * 10);
word = "ab";第二个语句word = "ab";将word更改为远离已分配的memory.You,它没有将字符串"ab"复制到由malloc分配的堆区域。
对于free,没有由malloc或类似函数分配的内存会导致程序崩溃。
试图释放无效指针(指向没有由calloc、malloc或realloc分配的内存块的指针)可能会影响后续的分配请求并导致错误。
您应该按照其他人的建议在这里使用strcpy。
https://stackoverflow.com/questions/32118545
复制相似问题