我用以下输出
编写了这个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
我也得到了正确的结果吗?
答案 0 :(得分:6)
默认情况下,本地变量未初始化并使用它们而未指定显式值会产生未定义的行为,这意味着可能发生任何事情。
C标准字面上没有定义会发生什么,所以这是一个(非)幸运巧合,你的前两个字符串是正确的,而最后一个字符串不正确。从C标准的角度来看,未定义的行为甚至可能导致您的机器爆炸。
默认情况下,全局变量初始化为零。
答案 1 :(得分:5)
int counter; // for counting temporaries
char s[10];
sprintf(s,"T%d",counter++);
如果您希望局部变量在对函数的调用之间保持相同,则可以使其static
:
static int counter = 0;
同时拥有同名的本地变量和全局变量也是一个坏主意。删除行时,最终使用全局变量。那就是它起作用的原因。
答案 2 :(得分:5)
CreateTemp中的int计数器“隐藏”全局计数器定义,因此始终为0,并且由于CreateTemp中的计数器未初始化,因此您可以获得任何数据。