C中全局结构的成员是否初始化为零?

tkw*_*954 23 c struct initialization

C中的全局或静态结构的成员是否保证自动初始化为零,与未初始化的全局变量或静态变量相同?

Mic*_*urr 37

从C99标准6.7.8/10"初始化":

如果未显式初始化具有自动存储持续时间的对象,则其值不确定.如果未显式初始化具有静态存储持续时间的对象,则:

- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员;
- 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员

由于全局变量和静态结构具有静态存储持续时间,答案是肯定的 - 它们初始化为零(结构中的指针将被设置为NULL指针值,通常为零位,但严格来说不需要).

C++ 2003标准有类似的要求(3.6.2"非本地对象的初始化"):

具有静态存储持续时间(3.7.1)的对象应在任何其他初始化发生之前进行零初始化(8.5).

在零初始化发生之后的某个时间,在更复杂的规则下调用构造函数(如果对象具有构造函数),这些规则控制这些调用的时间和顺序.


pmg*_*pmg 7

局部变量未初始化.

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)