2015-05-22 145 views
-2
list->history=(char*)malloc(sizeof(char)); 
strcpy(list->history,pch2); 

当我使用上面的代码时,我无法打开多个文件。它给了我这个错误:Aborted(核心转储)

* Error in `./exec2': malloc(): memory corruption: 0x00000000012060f0 * Aborted (core dumped)

我怎样才能打开多个文件?

+3

没有足够的信息。但是你的malloc不正确。你只允许表演一个字节 – mjs

回答

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 ISN” t安全,因为你不能控制输出缓冲区大小,并且strncpy效率低,因为它写入的字符数多于可能需要的值;既不返回指向最后复制字符的指针,而且集合strncpy,strncatsnprintf是非常不一致的关于长度参数的含义以及是否和如何添加空终止符)。

+1

...并且缺少空字符(有时) –

+0

memcpy(list-> history,pch2,N)将会执行此操作 – cfz42

+0

@clement_frndz:'memcpy'不起作用,因为它不会扫描源终止符,并在源字符串短于'N'时导致UB。 –

1

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

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

简单,使用

list->history = strdup(pch2); 

here,为什么不使用strncpy()

+0

C:中没有'strdup' :-( –

+0

@KerrekSB同意,但不是POSIX,一般接受吗? –

-2

我解决了这个问题,这里的改进代码:

a=strlen(pch2); 

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

strcpy(list->history, pch2); 
+3

没有。终止\ 0没有空间。你需要malloc(a * sizeof( char)+ 1)。strlen(“abc”)= 3,但是str [3] ='\ 0'这会产生4个字符。 – cfz42