C 中止(堆芯转储)

C 中止(堆芯转储),c,malloc,C,Malloc,当我使用上述代码时,我不能多次打开该文件。它给了我这个错误: *在“./exec2”中出错:malloc():内存损坏:0x00000000012060f0* 中止(堆芯转储) 如何多次打开文件?由于sizeof(char)为1,您分配的是1个字节,因此strcpy将具有未定义的行为,除非源字符串为空 不要使用strcpystrcpy;请改用,并注意您的分配大小和空终止: list->history=(char*)malloc(sizeof(char)); strcpy(list-&g

当我使用上述代码时,我不能多次打开该文件。它给了我这个错误:

*在“./exec2”中出错:malloc():内存损坏:0x00000000012060f0* 中止(堆芯转储)

如何多次打开文件?

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

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

list->history=(char*)malloc(sizeof(char));  
strcpy(list->history,pch2);
(事实上,情况有点可怕,因为无论是
strcpy
还是
strncpy
都不是绝对好的函数。就其本身而言,
strcpy
是不安全的,因为您无法控制输出缓冲区的大小,
strncpy
是低效的,因为它写入的零数比所需的多;也不返回指向最后一个缓冲区的指针。)复制的字符。此外,集合
strncpy
strncat
snprintf
在长度参数的含义以及是否和如何添加空终止符方面极不一致。)

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

我的建议是:去掉
malloc()
strcpy()
/
strncpy()
,最好使用
strdup()

简单地说,使用

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';

请看,为什么不使用
strncpy()

我解决了它,下面是改进的代码:

list->history = strdup(pch2);

没有足够的信息。但是您的malloc不正确。您只允许执行单个字节…并且缺少空字符(有时)@clement\u frndz:
memcpy
不起作用,因为它不扫描源终止符,因此当源字符串短于
N
时会导致UB。这一点你是对的,但我写这篇评论时假设他将字符串的确切长度malloc'ed+1。@clement\u frndz:我没有做任何假设:-)@KerrekSB是的,但是在pch2大于N-1的情况下,缓冲区无论如何都不会以NULL终止:-p。在这里添加
list->history[N-1]='\0'
是一种免费的安全性,因为在大多数情况下它“应该”已经存在。(但我的memcpy解决方案没有提供)没有。没有空间用于终止\0。您需要malloc(a*sizeof(char)+1)。strlen(“abc”)=3,但str[3]='\0',它包含4个字符。您的解决方案可能会起作用,也可能会导致总线错误。C:-(@KerrekSB同意,但它不是POSIX,这是普遍接受的吗?
a=strlen(pch2);

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

strcpy(list->history, pch2);