首先,我写了一个简单的程序。
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
是否有可能导致段故障?
答案 0 :(得分:6)
此行有未定义的行为
strncat (buf, tmp, strlen(tmp));
因为buf
来自malloc
未初始化。另一方面,strncat
期望buf
包含以null结尾的C字符串。
您可以通过将buf
的初始字符设置为'\0'
来解决此问题。
答案 1 :(得分:1)
如果您要使用strcat
或sttrncat
,则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