for(int i=0;i<5;i++)
{
char name[10];
strcat(name,"jack");
printf("%s\n",name );
}
输出:
����jack
����jackjack
����jackjackjack
����jackjackjackjack
����jackjackjackjackjack
第二个
for(int i=0;i<5;i++)
{
char name[10]="";
strcat(name,"jack");
printf("%s\n",name );
}
输出:
jack
jack
jack
jack
jack
第一种情况下的输出是如此奇怪?什么进去?这个概念是什么?
答案 0 :(得分:2)
这两个是不同的,因为第一个包含未初始化的数组name
。名称只是堆栈的该部分中存在的任何随机垃圾。但是,第二个代码段包含使用name
初始化的数组""
。因此它不打印任何内容,而“jack”打印适当的次数。
答案 1 :(得分:2)
在第一种情况下,字符串未初始化。因此,当您第一次连接时,您将在“名称”中从堆栈中获得一些随机字符。第二次你将有随机模式+插孔,依此类推。
在第二个代码段中,每次输入for
时,都会使用空字符串初始化字符串答案 2 :(得分:2)
char name[10];
strcat(name,"jack");
这里你刚刚声明了一个包含10个字符的未初始化字符串:当你尝试打印时它们是垃圾
然后你追加&#34; jack&#34;它
在您的情况中的每个循环上,使用相同的地址,这样您就可以获得连续的&#34; jack&#34;在随机字符之后。
实际上,printf
一直尝试打印,直到满足\0
:在每个循环上,并且因为程序重复使用相同的地址,\0
会被覆盖并且&#34; jack&# 34;再次附加(它隐式地以空值终止)。
char name[10]="";
strcat(name,"jack");
在这种情况下,数组在每个循环中初始化为空,每次你追加&#34; jack&#34;它。
即使使用相同的地址,在您使用\0
之前初始化也会确保strcat
。