解释C程序的以下输出

Coh*_*een -1 c global-variables

我用以下输出编写了这个C程序

#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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

Temp is T0  //Temp is T0
Temp is T1  //Temp is T1
Temp is T32600 //Temp is T2
Run Code Online (Sandbox Code Playgroud)

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

当我删除:

柜台; //用于计算临时工

...我有:

Temp is T0 
Temp is T1 
Temp is T2
Run Code Online (Sandbox Code Playgroud)

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

Int counter; / for counting temporaries
Run Code Online (Sandbox Code Playgroud)

我得到了正确的结果,但是当我保留它时,我得到了令人困惑的结果T2

另外,为什么当我添加static到:

int counter; // for counting temporaries
Run Code Online (Sandbox Code Playgroud)

成为:

static int counter; // for counting temporaries
Run Code Online (Sandbox Code Playgroud)

并删除:

int counter; // global for counting input tokens
Run Code Online (Sandbox Code Playgroud)

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

cad*_*luk 6

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

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

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


Ada*_*dam 5

 int counter; // for counting temporaries
 char s[10];
 sprintf(s,"T%d",counter++);
Run Code Online (Sandbox Code Playgroud)
  • 你必须在C中初始化变量.其余的值是未定义的; 经常是随意的.
  • 如果希望局部变量在对函数的调用之间保持相同,则可以进行以下操作static:

    static int counter = 0;
    
    Run Code Online (Sandbox Code Playgroud)

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


DBu*_*Bug 5

CreateTemp中的int计数器"隐藏"全局计数器定义,因此始终为0,并且由于CreateTemp中的计数器未初始化,因此您将获得正在发生的任何数据.