在void函数中,声明全局变量不会使其成为全局变量[C]

在void函数中,声明全局变量不会使其成为全局变量[C],c,global-variables,C,Global Variables,我以为我知道关于全局变量的一切,但现在我无法解决这个问题。我删除了一些代码 int counter;//global variable for increase or decrease int main(){ fun(); } void fun(){ counter=999; sad(); } void sad(){ printf("Counter is %d\n",counter); } 输出为0。为什么?它应该按照GCC 4.6、4.7和4.8中的预期工作 为了运行您的代码,我必须有一

我以为我知道关于全局变量的一切,但现在我无法解决这个问题。我删除了一些代码

int counter;//global variable for increase or decrease

int main(){
fun();
}

void fun(){
counter=999;
sad();
}
void sad(){
printf("Counter is %d\n",counter);
}

输出为0。为什么?

它应该按照GCC 4.6、4.7和4.8中的预期工作

为了运行您的代码,我必须有一些额外的行(声明和include)。尝试编译并运行以下命令:

#include <stdio.h>

int counter;//global variable for increase or decrease

void fun();
void sad();

int main(){
    fun();
}

void fun(){
    counter=999;
    sad();
}

void sad(){
    printf("Counter is %d\n",counter);
}
#包括
整数计数器//用于增加或减少的全局变量
虚无乐趣();
虚无悲伤();
int main(){
乐趣();
}
虚无乐趣(){
计数器=999;
sad();
}
void sad(){
printf(“计数器是%d\n”,计数器);
}

如果这给了您相同的行为,那么它一定是一个编译器错误。

您的代码有未定义的行为。
fun
sad
都缺少原型,您的代码在声明它们之前调用它们。因此,编译器假定这两个函数都返回
int
。由于函数实际上是
void
,这会导致未定义的行为

一旦您添加了原型,您的代码就可以运行了

#包括
整数计数器//用于增加或减少的全局变量

void fun();//也许您应该说明您正在使用的编译器。
#include <stdio.h>

int counter;//global variable for increase or decrease

void fun(); // <<== First prototype

int main(){
    fun();
}

void sad(); // <<== Second prototype

void fun(){
    counter=999;
    sad();
}

void sad(){
    printf("Counter is %d\n",counter);
}