C中全局或静态结构的成员是否保证自动初始化为零,与uninitialized global or static variables are的方式相同?
答案 0 :(得分:35)
从C99标准6.7.8 / 10“初始化”:
如果对象具有自动功能 存储持续时间未初始化 显然,它的价值是 不定。如果有一个对象 静态存储持续时间不是 显式初始化,然后:
- 如果它有指针类型,则为 初始化为空指针;
- 如果 它有算术类型,它是 初始化为(正数或无符号) 零;
- 如果它是一个聚合,每一个 成员初始化(递归) 根据这些规则;
- 如果是 一个联盟,第一个命名的成员是 按照初始化(递归) 这些规则
由于全局变量和静态结构具有静态存储持续时间,答案是肯定的 - 它们初始化为零(结构中的指针将被设置为NULL指针值,通常为零位,但严格来说不需要定)。
C ++ 2003标准有类似的要求(3.6.2“非本地对象的初始化”):
具有静态存储持续时间(3.7.1)的对象应在进行任何其他初始化之前进行零初始化(8.5)。
在零初始化发生之后的某个时间,在更复杂的规则下调用构造函数(如果对象具有构造函数),这些规则控制这些调用的时间和顺序。
答案 1 :(得分:7)
未初始化局部变量。
struct foobar {
int x;
};
int main(void) {
struct foobar qux;
/* qux is uninitialized. It is a local variable */
return 0;
}
静态局部变量初始化为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;
}
全局变量初始化为0(零)
struct foobar {
int x;
};
struct foobar qux;
/* qux is initialized (to 0). It is a global variable */
int main(void) {
return 0;
}
答案 2 :(得分:1)
struct
在这种方式上与普通静态C变量没有区别。如果它是静态的,则为struct
保留的内存完全初始化为0.
答案 3 :(得分:0)
是的,所有全局数据都被清零,包括结构,类和联合的成员。
答案 4 :(得分:-3)
程序全局部分的所有数据都设置为零。
BSS段也称为 未初始化的数据最后开始 数据段并包含所有 未初始化的全局变量和 初始化的静态变量 默认为零。比如一个 变量声明为static int i;将 包含在BSS部分中。
我不知道为什么自己尝试一下这么难。