小编sna*_*ppy的帖子

什么构成联盟中的填充?

我正在尝试解释关于未明确初始化时联合的静态(和线程局部)初始化的C11标准.

第6.7.9节10(第139页)规定如下:

如果未显式初始化具有自动存储持续时间的对象,则其值不确定.如果未显式初始化具有静态或线程存储持续时间的对象,则:

- 如果它有指针类型,则将其初始化为空指针;

- 如果它有算术类型,则初始化为(正或无符号)零;

- 如果它是一个聚合,则根据这些规则初始化(递归)每个成员,并将任何填充初始化为零比特;

- 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员,并将任何填充初始化为零位;

假设我们使用amd64架构,给出以下声明:

static union { uint32_t x; uint16_t y[3]; } u;
Run Code Online (Sandbox Code Playgroud)

可以u.y[2]包含非零值,还是初始化为零,因为它被视为填充?

我已经仔细研究了C11的标准,但是关于什么构成联盟中的填充,几乎没有任何解释.在C99标准(第126页)中没有提到填充,因此在这种情况下u.y[2]可以是非零.

c language-lawyer c11

5
推荐指数
2
解决办法
168
查看次数

标签 统计

c ×1

c11 ×1

language-lawyer ×1