list->history=(char*)malloc(sizeof(char));
strcpy(list->history,pch2);
当我使用上面的代码时,我无法打开多个文件。它给了我这个错误:Aborted(核心转储)
* Error in `./exec2': malloc(): memory corruption: 0x00000000012060f0 * Aborted (core dumped)
我怎样才能打开多个文件?
list->history=(char*)malloc(sizeof(char));
strcpy(list->history,pch2);
当我使用上面的代码时,我无法打开多个文件。它给了我这个错误:Aborted(核心转储)
* Error in `./exec2': malloc(): memory corruption: 0x00000000012060f0 * Aborted (core dumped)
我怎样才能打开多个文件?
由于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
ISN” t安全,因为你不能控制输出缓冲区大小,并且strncpy
效率低,因为它写入的字符数多于可能需要的值;既不返回指向最后复制字符的指针,而且集合strncpy
,strncat
和snprintf
是非常不一致的关于长度参数的含义以及是否和如何添加空终止符)。
...并且缺少空字符(有时) –
memcpy(list-> history,pch2,N)将会执行此操作 – cfz42
@clement_frndz:'memcpy'不起作用,因为它不会扫描源终止符,并在源字符串短于'N'时导致UB。 –
您的malloc()
有问题,它没有为指针分配足够的内存以用作strpy()
中的目标字符串。
我的建议:摆脱malloc()
和strcpy()
/strncpy()
,使用strdup()
。更好。
简单,使用
list->history = strdup(pch2);
见here,为什么不使用strncpy()
。
C:中没有'strdup' :-( –
@KerrekSB同意,但不是POSIX,一般接受吗? –
我解决了这个问题,这里的改进代码:
a=strlen(pch2);
list->history=(char*)malloc(a*sizeof(char) + 1);
strcpy(list->history, pch2);
没有。终止\ 0没有空间。你需要malloc(a * sizeof( char)+ 1)。strlen(“abc”)= 3,但是str [3] ='\ 0'这会产生4个字符。 – cfz42
没有足够的信息。但是你的malloc不正确。你只允许表演一个字节 – mjs