42

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

4

5 回答 5

60

是的,所有成员都针对具有静态存储的对象进行了初始化。请参阅 C99 标准中的 6.7.8/10 (PDF 文档)

如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。如果具有静态存储持续时间的对象未显式初始化,则:
— 如果它具有指针类型,则将其初始化为空指针;
— 如果它具有算术类型,则将其初始化为(正或无符号)零;
— 如果是聚合,则每个成员都根据这些规则(递归地)初始化;
— 如果是联合,则根据这些规则(递归地)初始化第一个命名成员。

要将对象中的所有内容(无论是否为 0)初始化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
于 2012-11-06T12:33:37.430 回答
2

Yes, file-scope static variables are initialized to zero, including all members of structures, arrays, etc.

See this question for reference (I'll vote to close this as a duplicate, too).


Edit: this question is getting much better answers, so I'm voting to close that question as a duplicate of this, instead.

For reference, here is the C FAQ link from that question's accepted answer, although of course the C99 and C11 standards linked here are canonical.

于 2012-11-06T12:36:15.337 回答
2

是的,它们是,只要它们具有静态或线程存储持续时间。

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

如果具有静态或线程存储持续时间的对象未显式初始化,则:

[...]

  • 如果它具有算术类型,则将其初始化为(正或无符号)零;
  • 如果是聚合,则根据这些规则(递归)初始化每个成员,并将任何填充初始化为零位;

[...]

于 2012-11-06T12:34:12.033 回答
1

我要补充一点,静态变量(或数组)分为两种类型。

初始化的是在编译时从代码中获得值的那些。这些通常存储在 DS 中,尽管这是特定于编译器的。

另一种类型是未初始化的静态变量,它在运行时初始化并存储到 BSS 段中,尽管这也是编译器特定的。

BSS

于 2012-11-06T12:39:36.720 回答
0

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

隐式初始化

如果未提供初始化程序:

  • 具有自动存储持续时间的对象被初始化为不确定的值(可能是陷阱表示)
  • 具有静态和线程本地存储持续时间的对象是零初始化的
于 2021-02-20T08:43:13.773 回答