我有一个关于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
?
答案 0 :(得分:49)
是的,所有成员都是针对具有静态存储的对象进行初始化的。见C99 Standard (PDF document)
中的6.7.8 / 10如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。 如果具有静态存储持续时间的对象未明确初始化,则:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它具有算术类型,则将其初始化为(正或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员;
- 如果它是一个联合,则根据这些初始化(递归)第一个命名成员 规则。
要将对象中的所有内容(无论是否为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
答案 1 :(得分:2)
是的,只要它们具有静态或线程存储持续时间,它们就是。
C11(n1570),§6.7.9初始化#10
如果未初始化具有静态或线程存储持续时间的对象 明确地说:
[...]
- 如果它有算术类型,则初始化为(正数或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员, 并且任何填充都被初始化为零位;
[...]
答案 2 :(得分:2)
是的,文件范围的静态变量初始化为零,包括结构,数组等的所有成员。
请参阅this question以供参考(我也会投票将其作为副本关闭)。
编辑:这个问题得到了更好的答案,所以我投票决定将该问题作为此的副本关闭。
作为参考,这里是C FAQ link来自该问题的接受答案,当然这里链接的C99和C11标准是规范的。
答案 3 :(得分:1)
我想补充一点,静态变量(或数组)分为两种类型。
已初始化是在编译时从代码中获得值的那些。这些通常存储在DS中,尽管这是特定于编译器的。
另一种类型是未初始化静态,它们在运行时初始化并存储到BSS段中,但这又是编译器特定的。
答案 4 :(得分:0)
对于那些不想阅读标准的人,https://en.cppreference.com/w/c/language/initialization中也有提到:
<块引用>隐式初始化
如果没有提供初始化器: