将全局变量定义为c中的局部变量

时间:2015-04-12 21:06:08

标签: c

我尝试过这样的事情:

int globalvar=10;

void print ()
{
    printf("%d \n",globalvar);
}

int main(){
    int globalvar=5;
    printf("%d \n",globalvar);
    print ();
    while (1);
    return 0;
}

然后输出就像这样

5    
10

我得出结论,C在main中创建了一个“globalvar”的LOCAL实例,并用printf打印出的值10初始化。

我对这一点没事,但我对一些新观点感到困惑:

  1. globalvar是在main之前初始化的,它应该具有整个程序的范围,在DS中具有相同的内存位置,在这种情况下,如果在函数中本地定义了同名的变量,会发生什么情况(例如:主要),?

  2. 第二个问题与链接器有关:链接器如何处理这两个相同名称的变量,以便它以执行的方式执行?

  3. PS:在关注问题之后,我想说我真的搜索了这个问题而我没有找到类似的问题,我认为提出这样的问题对其他人有用。 我希望我不是误导

3 个答案:

答案 0 :(得分:7)

  

我得出结论,C创建了一个" globalvar"的局部实例。在main中,它用printf打印出来的值10初始化。

不,创建了一个名为globalvar的局部变量,初始化为5.然后在printf中使用它。 print()根本不知道该变量,并使用全局设置为10。

  

在一个函数中本地定义了同名的变量(例如:main),会发生什么情况?

局部变量优先。如果要使用全局变量,则应将本地变量命名为不同的,以使其不冲突。

这都在同一个文件中,因此链接器根本不处理这两个变量的相互作用。

答案 1 :(得分:1)

首先调用main中的printf。它输出5 - main中定义的局部变量的值。

然后调用print,并调用printf输出全局变量的值。

链接器没有什么可担心的 - 它根本不处理局部变量,它们不能通过名称从它们声明的函数外部访问,因此局部变量的名称通常甚至不可见接头

答案 2 :(得分:1)

您的局部变量会覆盖函数内的全局变量。局部变量的范围将在您的函数范围内尽快结束。因此,如果您调用另一个没有同名局部变量的函数,则可以看到全局变量值。

链接器在此功能中没有任何作用。此功能由程序中变量的范围管理。