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

时间:2014-06-08 11:39:24

标签: 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.为什么?

2 个答案:

答案 0 :(得分:3)

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

添加原型后,您的代码runs perfectly

#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);
}

答案 1 :(得分:0)

它应该可以工作,并且实际上在GCC 4.6,4.7和4.8中按预期工作。

为了运行你的代码,我必须有一些额外的行(声明和包含)。尝试编译并运行它:

#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);
}

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