解释C程序的以下输出

时间:2015-11-11 17:59:37

标签: c global-variables

我用以下输出

编写了这个C程序
<input class="input-lowercase" type="text" />

输出:

#include<stdio.h>
#include<string.h>
int counter; // global for counting input tokens
char * CreateTemp()
{ 
 int counter; // for counting temporaries
 char s[10];
 sprintf(s,"T%d",counter++);
 return(strdup(s));
}
main()
{
 char *s1;
 char *s2;
 char *s3;
 s1=CreateTemp();
 s2=CreateTemp();
 printf("Temp is %s\n",s1);
 printf("Temp is %s\n",s2);
 s3=CreateTemp();
 printf("Temp is %s\n",s3);
}

我不知道为什么我为T2输出这样的输出?是什么原因?

当我删除时:

int counter; //用于计算临时工具

......我得到了:

Temp is T0  //Temp is T0
Temp is T1  //Temp is T1
Temp is T32600 //Temp is T2

为什么,当我删除特定行时:

Temp is T0 
Temp is T1 
Temp is T2

我是否得到了正确的结果,但是当我保留它时,Int counter; / for counting temporaries 的结果令人困惑?

另外,为什么我将T2添加到:

static

成为:

int counter; // for counting temporaries

并删除:

static int counter; // for counting temporaries

我也得到了正确的结果吗?

3 个答案:

答案 0 :(得分:6)

默认情况下,本地变量未初始化并使用它们而未指定显式值会产生未定义的行为,这意味着可能发生任何事情

C标准字面上没有定义会发生什么,所以这是一个(非)幸运巧合,你的前两个字符串是正确的,而最后一个字符串不正确。从C标准的角度来看,未定义的行为甚至可能导致您的机器爆炸。

默认情况下,全局变量初始化为零。

答案 1 :(得分:5)

 int counter; // for counting temporaries
 char s[10];
 sprintf(s,"T%d",counter++);
  • 你必须在C中初始化变量.Othewise它们的值 未定义;经常是随意的东西。
  • 如果您希望局部变量在对函数的调用之间保持相同,则可以使其static

    static int counter = 0;
    

同时拥有同名的本地变量和全局变量也是一个坏主意。删除行时,最终使用全局变量。那就是它起作用的原因。

答案 2 :(得分:5)

CreateTemp中的int计数器“隐藏”全局计数器定义,因此始终为0,并且由于CreateTemp中的计数器未初始化,因此您可以获得任何数据。