中止(核心倾倒)

时间:2015-05-22 22:01:48

标签: c malloc

list->history=(char*)malloc(sizeof(char));  
strcpy(list->history,pch2);

当我使用上面的代码时,我无法多次打开该文件。它给了我这个错误:

  

*`./exec2' ;: malloc()出错:内存损坏:0x00000000012060f0 *   中止(核心倾销)

如何多次打开文件?

3 个答案:

答案 0 :(得分:3)

由于sizeof(char)为1,因此分配1个字节,因此strcpy将具有未定义的行为,除非源字符串为空。

不要使用strcpy;请改用strncpy,并注意您的分配大小和空终止:

size_t N = 1;   // or anything you deem suitable

list->history = malloc(N);
strncpy(list->history, pch2, N - 1);  // safe
list->history[N - 1] = '\0';

(实际上,情况有点可怕,因为strcpystrncpy都不是绝对好的功能。strcpy本身并不安全,因为你可以&#39 ; t控制输出缓冲区大小,strncpy效率低,因为它写的零比可能需要的更多;不返回指向最后复制字符的指针。此外,集合strncpy,{{1 }}和strncat关于length参数的含义以及是否以及如何添加null终止符非常不一致。)

答案 1 :(得分:1)

您的malloc()有问题,它没有为指针分配足够的内存以用作strpy()中的目标字符串。

我的建议:摆脱malloc()strcpy() / strncpy(),使用strdup()。更好。

简单地说,使用

list->history = strdup(pch2);

请参阅here 为何使用strncpy()

答案 2 :(得分:-2)

我解决了,这是改进的代码:

a=strlen(pch2);

list->history=(char*)malloc(a*sizeof(char) + 1);

strcpy(list->history, pch2);