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

时间:2010-11-02 18:02:58

标签: c struct initialization

C中全局或静态结构的成员是否保证自动初始化为零,与uninitialized global or static variables are的方式相同?

5 个答案:

答案 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部分中。

Bss segment

我不知道为什么自己尝试一下这么难。