静态变量存储在程序的数据段中,与存储在堆栈部分中的自动变量不同。 假设我编写如下代码。
#include <stdio.h>
void temp();
int main()
{
static int a=10;
temp();
return 0;
}
void temp()
{
static int a=20;
}
在2个函数中定义相同的静态变量名称。在数据段布局中,将有2个具有相同名称的变量。 这不会在编译/执行时产生混淆吗?目前如何避免这种情况?
答案 0 :(得分:2)
这两个静态变量具有不同的范围,因此它们不会发生冲突,static是存储类,它定义了存储变量的位置。它与变量范围无关。
在数据段布局中,将有2个具有相同名称的变量
数据段中没有任何命名,变量仅由其地址标识,而不是名称
答案 1 :(得分:1)
编译器编译完源文件后,变量本身在生成的代码中不再存在,只有位置。
这就是为什么你可以在两个不同的函数中有两个不同的static
变量同名。
并不是说编译器如何实现它真的很重要,只要它将不同范围内的变量彼此分开。
答案 2 :(得分:0)
在数据段布局中,将有2个具有相同名称的变量。这不会在编译/执行时产生混淆吗?
这是变量范围发挥作用的地方。
当a
正在运行时,temp()
中的{p> a
会在main()
中隐藏temp()
。这意味着当temp()
正在运行时,静态局部变量a
生效。当控件返回main
时,a
中main
的版本生效。