C中静态变量的初始化

时间:2012-11-06 12:29:10

标签: c static struct initialization

我有一个关于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

5 个答案:

答案 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段中,但这又是编译器特定的。

BSS

答案 4 :(得分:0)

对于那些不想阅读标准的人,https://en.cppreference.com/w/c/language/initialization中也有提到:

<块引用>

隐式初始化

如果没有提供初始化器:

  • 具有自动存储持续时间的对象被初始化为不确定值(可能是陷阱表示)
  • 具有静态和线程本地存储持续时间的对象是零初始化的