'静态' 对象

问题描述:

可能重复:
Does gcc automatically initialize static variables to zero?'静态' 对象

是静态声明保证在函数内部对象与0初始化?

例如:

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

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

简短的回答,是的。

静态的未初始化变量驻留在可执行文件的.bss段中,操作系统在调用main之前,在程序启动时分配并将它们归零。

+1

初始化它仍然是一个好主意。 – Dima 2011-05-04 17:49:15

+0

@迪玛:一个特殊的原因? – 2011-05-04 17:52:28

+1

这是一个很好的做法,恕我直言。这样您就不必考虑哪些变量会自动初始化,哪些变量不会自动初始化。假设您以后决定'x'不应该是静态的,但忘记初始化它,并且该错误将是一个极大的痛苦。 – Dima 2011-05-04 17:58:59

没错。要了解更多可以参考完全相同的问题问前一阵子在这里:

Does gcc automatically initialize static variables to zero?

C99 Standard说:

5.1.2执行环境

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

而且它也说,与static限定词定义一个局部变量具有“静态存储”,并在没有初始化的所有对象采取正确的类型,它们的值0。

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

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

所有的静态变量存储在Datasection在存储部分,所有的变量设置为默认值。