【问题标题】:Static variable storage clarification静态变量存储说明
【发布时间】:2016-12-15 13:29:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: c static compiler-construction initialization


    【解决方案1】:

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

    在数据段布局中会有2个同名变量

    数据段中没有任何命名,变量只是通过地址来标识,而不是名称

    【讨论】:

      【解决方案2】:

      一旦编译器编译了您的源文件,变量本身就不再存在于生成的代码中,只有它们的位置

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

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

      【讨论】:

        【解决方案3】:

        在数据段布局中将有 2 个同名变量。这不会在编译/执行时造成混乱吗?

        这就是变量的作用域发挥作用的地方。

        temp() 运行时,temp() 中的a 将遮蔽main() 中的a。这意味着当temp() 运行静态局部变量a 时有效。当控制权返回到main 时,main 中的a 版本生效。

        【讨论】:

        • 不,这里没有阴影。如果声明了全局a,就会有。
        • @MichaelWalz 无论是否为静态,阴影都会发生。
        • 是的,static 无关紧要,但temp() 中的a(静态或非静态)不会影响a(静态与否)main()。它将隐藏先前声明的 global 变量 a(静态或非静态)。 Read this 了解更多详情。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多