printf在malloc之后打印一个奇怪的字符

时间:2017-03-19 17:00:06

标签: c

我试图追加一个字符串。所以我从malloc开始,然后追加该字符串。

char * loc,*X,*Y;
X = "4";
Y = "8";
loc = (char *)malloc(strlen(X)+strlen(Y)+6); //its +1 for the comma between, +1 for '\0' and +2 for "->" +2 for "()".
strcat(loc,"->");
strcat(loc,"(");
strcat(loc,X);
strcat(loc,",");
strcat(loc,Y);
strcat(loc,")");
printf("%s\n", loc);

所以,当我跑步时,我等着看:

  

- >(4,8)

相反,在字符串的开头有一个奇怪的字符,我看到了:

  

└->(4,8)

如果我在malloc之后使用strcpy(loc,"")清除字符串,那么它就不存在了。 为什么这个

  

出现在第一位?

2 个答案:

答案 0 :(得分:4)

malloc函数不会初始化它分配的内存。它的内容是不确定。因此,你不知道在哪里,甚至如果在那个记忆中有一个字符串终止符。

strcpy函数并不关心现有内容,而是会写一个终结符。另一方面,strcat函数依赖于查找字符串终止符以了解它应该从哪里开始写入,但正如我们已经建立的那样,内存中甚至可能没有终结符。

所以你有四个选择:

  1. 使用strcpy作为第一个电话,而不是strcat

  2. 明确将第一个元素设置为终结符,如loc[0] = '\0'

  3. 使用calloc将内存初始化为零,这恰好与字符串终止符相同。

  4. 请改用snprintf

  5. 我建议选择四。

答案 1 :(得分:2)

就像现在一样,您的代码访问未初始化的内存,调用未定义的行为。该缓冲区中可能有任何

您需要初始化内存。由于您将bugger视为C字符串,只需将第一个字节设置为NUL终止符\0即可。

*loc = '\0';

现在你有一个长度为零的有效字符串。