list->history=(char*)malloc(sizeof(char));
strcpy(list->history,pch2);
当我使用上面的代码时,我无法多次打开该文件。它给了我这个错误:
*`./exec2' ;: malloc()出错:内存损坏:0x00000000012060f0 * 中止(核心倾销)
如何多次打开文件?
答案 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';
(实际上,情况有点可怕,因为strcpy
和strncpy
都不是绝对好的功能。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);