strncat上的分段错误()

时间:2014-11-22 10:21:03

标签: c string segmentation-fault heap-memory

首先,我写了一个简单的程序。

  1 #include <string.h>
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4
  5 int main()
  6 {
  7     char *buf = (char*)malloc(sizeof(char)*2000);
  8     char tmp[256];
  9     strcpy (tmp, "test");
 10     printf ("tmp: %s\n", tmp);
 11     strncat (buf, tmp, strlen(tmp));
 12     printf ("buf: %s\n", buf);
 13 }

预期结果是:

tmp: test
buf: test

但是我在我的大项目中组合代码之后。 (使用大量堆段)

153     char *inbuf = (char*)malloc(sizeof(char)*2000);
154     char *outbuf = (char*)malloc(sizeof(char)*2000);
155     char *oldinbuf = (char*)malloc(sizeof(char)*2000);
156     char *errbuf = (char*)malloc(sizeof(char)*2000);
157     memset (inbuf, '\0', strlen(inbuf));
158     memset (oldinbuf, '\0', strlen(oldinbuf));
159     memset (errbuf, '\0', strlen(oldinbuf));

然后在第11行中,我收到错误消息Segmentation fault (core dumped)

strncat是否有可能导致段故障?

2 个答案:

答案 0 :(得分:6)

此行有未定义的行为

strncat (buf, tmp, strlen(tmp));

因为buf来自malloc未初始化。另一方面,strncat期望buf包含以null结尾的C字符串。

您可以通过将buf的初始字符设置为'\0'来解决此问题。

答案 1 :(得分:1)

如果您要使用strcatsttrncat,则buf应具有有效字符串。所以写

char *buf = (char*)malloc(sizeof(char)*2000);
buf[0] = '\0';

此外,如果您使用strncat,那么您必须自己附加终止零,以便复制是安全的。例如

size_t n = strlen(tmp);
strncat (buf, tmp, n + 1 );
buf[n] = '\0';

虽然在这种特殊情况下,您只能使用strcat代替strncat