【发布时间】:2011-05-04 17:46:29
【问题描述】:
可能重复:
Does gcc automatically initialize static variables to zero?
函数内的静态声明对象是否保证用0初始化?
例如:
int func(void)
{
static int x;
...
}
标准是否承诺在第一次调用func() 时x = 0?
【问题讨论】:
可能重复:
Does gcc automatically initialize static variables to zero?
函数内的静态声明对象是否保证用0初始化?
例如:
int func(void)
{
static int x;
...
}
标准是否承诺在第一次调用func() 时x = 0?
【问题讨论】:
C99 Standard 说:
5.1.2 执行环境
...静态存储中的所有对象都应 在程序之前初始化(设置为其初始值) 启动。
它还说,使用static 限定符定义的局部变量具有“静态存储”,并且在没有初始化的情况下,所有对象都为它们采用正确类型的值 0。
【讨论】:
没错。要了解更多信息,您可以在此处参考刚才提出的完全相同的问题:
【讨论】:
简短的回答,是的。
静态的、未初始化的变量位于可执行文件的.bss 段中,操作系统会在程序启动时分配并清零它们,然后调用main。
【讨论】:
x 不应该是静态的,但忘记初始化它,那么这个 bug 将很难找到。
.data 而不是.bss(或等价物)中,从而无目的放大您的二进制文件。这可以对大型数组或结构产生很大影响。
是的,它确实被初始化为零。但是,使用静态方法变量可能仍然不是一个好主意。 C# 已经明确避免了这种混淆,并且放弃了对静态方法变量的支持。
【讨论】:
所有静态变量都存储在内存段的Datasection中,所有变量都设置为默认值。
【讨论】: