用C静态变量的初始化(The initialization of static variables

2019-06-18 22:37发布

我有一个静态变量的C.初始化我知道的问题,如果我们声明一个全局静态变量,默认情况下该值为0 。 例如:

static int a; //although we do not initialize it, the value of a is 0

但有关数据结构如下内容:

typedef struct
{
    int a;
    int b;
    int c;
} Hello;

static Hello hello[3];

被所有成员中的每一个结构hello[0] hello[1] hello[2]初始化为0

Answer 1:

是的,所有成员都初始化静态存储对象。 见6.7.8 / 10的C99标准(PDF文件)

如果具有自动存储持续时间的对象没有被明确初始化,它的值是不确定的。 如果具有静态存储持续时间的对象没有初始化 ,则:
- 如果它有指针类型,它被初始化为空指针;
- 如果它有算术类型,它被初始化为(正或无符号的)零;
- 如果它是一个聚集体,每一个成员被初始化(递归地)根据这些规则;
- 如果它是联合,第一个命名构件(递归地)根据这些规则进行初始化。

要在对象初始化的一切,无论是static或没有,为0,我喜欢用普遍零初始化

sometype identifier0 = {0};
someothertype identifier1[SOMESIZE] = {0};
anytype identifier2[SIZE1][SIZE2][SIZE3] = {0};

有在C.一种没有局部初始化对象要么完全初始化(至0右种在不存在不同的值的)或者完全不进行初始化。
如果你想部分初始化,你不能初始化开始。

int a[2]; // uninitialized
int b[2] = {42}; // b[0] == 42; b[1] == 0;
a[0] = -1; // reading a[1] invokes UB


Answer 2:

是的,他们,只要他们有静态或线程存储时限。

C11(n1570),第6.7.9初始化#10

如果具有静态或线程存储时限的对象没有初始化,则:

[...]

  • 如果它有算术类型,它被初始化为(正或无符号的)零;
  • 如果它是一个聚集体,每一个部件(递归地)根据这些规则初始化,并且任何填充被初始化为零比特;

[...]



Answer 3:

是的,文件范围静态变量初始化为零,包括结构的所有成员,阵列等

见这个问题以供参考(我要投票关闭此为重复,太)。


编辑:这个问题是越来越多更好的答案,所以我投票关闭这个问题由于这一重复,来代替。

作为参考,这里是ÇFAQ链接从这个问题的公认的答案,当然,这里链接的C99和C11标准规范。



Answer 4:

我想补充一点,静态变量(或阵列)被分为两种类型。

初始化是在编译时给出的代码值的人。 这些通常是存储在DS虽然这是编译器特定的。

另一种类型是在运行时初始化并存储到BSS段虽然这同样是编译器特定初始化静态。

BSS



文章来源: The initialization of static variables in C