Mic*_*urr 37
从C99标准6.7.8/10"初始化":
如果未显式初始化具有自动存储持续时间的对象,则其值不确定.如果未显式初始化具有静态存储持续时间的对象,则:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员;
- 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员
由于全局变量和静态结构具有静态存储持续时间,答案是肯定的 - 它们初始化为零(结构中的指针将被设置为NULL指针值,通常为零位,但严格来说不需要).
C++ 2003标准有类似的要求(3.6.2"非本地对象的初始化"):
具有静态存储持续时间(3.7.1)的对象应在任何其他初始化发生之前进行零初始化(8.5).
在零初始化发生之后的某个时间,在更复杂的规则下调用构造函数(如果对象具有构造函数),这些规则控制这些调用的时间和顺序.
局部变量未初始化.
struct foobar {
int x;
};
int main(void) {
struct foobar qux;
/* qux is uninitialized. It is a local variable */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
静态局部变量初始化为0(零)
struct foobar {
int x;
};
int main(void) {
static struct foobar qux;
/* qux is initialized (to 0). It is a static local variable */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
全局变量初始化为0(零)
struct foobar {
int x;
};
struct foobar qux;
/* qux is initialized (to 0). It is a global variable */
int main(void) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)