【问题标题】:'static' object in a function [duplicate]函数中的“静态”对象[重复]
【发布时间】:2011-05-04 17:46:29
【问题描述】:

可能重复:
Does gcc automatically initialize static variables to zero?

函数内的静态声明对象是否保证用0初始化?

例如:

int func(void)
{
   static int x;
   ...
}

标准是否承诺在第一次调用func()x = 0

【问题讨论】:

    标签: c static


    【解决方案1】:

    C99 Standard 说:

    5.1.2 执行环境

    ...静态存储中的所有对象都应 在程序之前初始化(设置为其初始值) 启动。

    它还说,使用static 限定符定义的局部变量具有“静态存储”,并且在没有初始化的情况下,所有对象都为它们采用正确类型的值 0。

    【讨论】:

      【解决方案2】:

      没错。要了解更多信息,您可以在此处参考刚才提出的完全相同的问题:

      Does gcc automatically initialize static variables to zero?

      【讨论】:

        【解决方案3】:

        简短的回答,是的。

        静态的、未初始化的变量位于可执行文件的.bss 段中,操作系统会在程序启动时分配并清零它们,然后调用main

        【讨论】:

        • 初始化还是不错的。
        • 这是一个很好的做法,恕我直言。这样您就不必考虑哪些变量是自动初始化的,哪些不是。假设你后来决定 x 不应该是静态的,但忘记初始化它,那么这个 bug 将很难找到。
        • 明确地初始化它不是“一个好主意”。由于各种原因,几乎所有编译器都会将显式初始化的变量放在.data 而不是.bss(或等价物)中,从而无目的放大您的二进制文件。这可以对大型数组或结构产生很大影响。
        【解决方案4】:

        是的,它确实被初始化为零。但是,使用静态方法变量可能仍然不是一个好主意。 C# 已经明确避免了这种混淆,并且放弃了对静态方法变量的支持。

        http://blogs.msdn.com/b/csharpfaq/archive/2004/05/11/why-doesn-t-c-support-static-method-variables.aspx

        【讨论】:

          【解决方案5】:

          所有静态变量都存储在内存段的Datasection中,所有变量都设置为默认值。

          【讨论】:

            猜你喜欢
            • 2014-08-04
            • 2015-01-10
            • 2012-10-18
            • 2011-05-20
            • 2020-12-25
            • 2021-02-02
            • 1970-01-01
            • 1970-01-01
            • 2020-08-29
            相关资源
            最近更新 更多