静态变量存储澄清

时间:2016-12-15 13:29:33

标签: c static compiler-construction initialization

静态变量存储在程序的数据段中,与存储在堆栈部分中的自动变量不同。 假设我编写如下代码。

#include <stdio.h>
void temp();
int main()
{
    static int a=10;
    temp();
    return 0;
}
void temp()
{
    static int a=20;
}

在2个函数中定义相同的静态变量名称。在数据段布局中,将有2个具有相同名称的变量。 这不会在编译/执行时产生混淆吗?目前如何避免这种情况?

3 个答案:

答案 0 :(得分:2)

这两个静态变量具有不同的范围,因此它们不会发生冲突,static是存储类,它定义了存储变量的位置。它与变量范围无关。

  

在数据段布局中,将有2个具有相同名称的变量

数据段中没有任何命名,变量仅由其地址标识,而不是名称

答案 1 :(得分:1)

编译器编译完源文件后,变量本身在生成的代码中不再存在,只有位置

这就是为什么你可以在两个不同的函数中有两个不同的static变量同名。

并不是说编译器如何实现它真的很重要,只要它将不同范围内的变量彼此分开。

答案 2 :(得分:0)

  

在数据段布局中,将有2个具有相同名称的变量。这不会在编译/执行时产生混淆吗?

这是变量范围发挥作用的地方。

a正在运行时,temp()中的{p> a会在main()中隐藏temp()。这意味着当temp()正在运行时,静态局部变量a生效。当控件返回main时,amain的版本生效。