我有一个静态变量的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
?
是的,所有成员都初始化静态存储对象。 见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
是的,文件范围静态变量初始化为零,包括结构的所有成员,阵列等
见这个问题以供参考(我要投票关闭此为重复,太)。
编辑:这个问题是越来越多更好的答案,所以我投票关闭这个问题由于这一重复,来代替。
作为参考,这里是ÇFAQ链接从这个问题的公认的答案,当然,这里链接的C99和C11标准规范。
我想补充一点,静态变量(或阵列)被分为两种类型。
初始化是在编译时给出的代码值的人。 这些通常是存储在DS虽然这是编译器特定的。
另一种类型是在运行时初始化并存储到BSS段虽然这同样是编译器特定初始化静态。
BSS