你能解释下面两个c代码片段之间的区别吗?

时间:2014-12-09 16:04:40

标签: c

    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

第一种情况下的输出是如此奇怪?什么进去?这个概念是什么?

3 个答案:

答案 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