我尝试过这样的事情:
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初始化。
我对这一点没事,但我对一些新观点感到困惑:
globalvar是在main之前初始化的,它应该具有整个程序的范围,在DS中具有相同的内存位置,在这种情况下,如果在函数中本地定义了同名的变量,会发生什么情况(例如:主要),?
第二个问题与链接器有关:链接器如何处理这两个相同名称的变量,以便它以执行的方式执行?
答案 0 :(得分:7)
我得出结论,C创建了一个" globalvar"的局部实例。在main中,它用printf打印出来的值10初始化。
不,你创建了一个名为globalvar
的局部变量,初始化为5.然后在printf
中使用它。 print()
根本不知道该变量,并使用全局设置为10。
在一个函数中本地定义了同名的变量(例如:main),会发生什么情况?
局部变量优先。如果要使用全局变量,则应将本地变量命名为不同的,以使其不冲突。
这都在同一个文件中,因此链接器根本不处理这两个变量的相互作用。
答案 1 :(得分:1)
首先调用main
中的printf。它输出5 - main
中定义的局部变量的值。
然后调用print
,并调用printf输出全局变量的值。
链接器没有什么可担心的 - 它根本不处理局部变量,它们不能通过名称从它们声明的函数外部访问,因此局部变量的名称通常甚至不可见接头
答案 2 :(得分:1)
您的局部变量会覆盖函数内的全局变量。局部变量的范围将在您的函数范围内尽快结束。因此,如果您调用另一个没有同名局部变量的函数,则可以看到全局变量值。
链接器在此功能中没有任何作用。此功能由程序中变量的范围管理。