不同大小成员的联合体内存布局?

26
typedef union epoll_data
{
  void        *ptr;
  int          fd;
  __uint32_t   u32;
  __uint64_t   u64;
} epoll_data_t;

这里的int__uint32_t都是4字节,而其他的都是8字节。

当我们将fd设置为一个int时,它是位于前4字节还是后4字节,还是取决于大小端模式?

感谢提供任何原因。


1
在实践中,较短的类型始终位于开头,但我不确定是否明确说明了这一点。 - R.. GitHub STOP HELPING ICE
2个回答

41

它位于前4个字节。根据C99标准§6.7.2.1/14(在C11和C18中为§6.7.2.1/16):

一个union的大小足以包含其最大成员。最多只能将一个成员的值存储在联合体对象中。适当转换后,指向联合对象的指针指向其每个成员(或者如果成员是位域,则指向其所在的单元),反之亦然。

这意味着联合体所有成员的地址都相同。


1
不是这样的,由于填充的原因,它们可以从不同的位置开始。请参见下面链接的ELF标准中的图3.5。这是一个示例,说明联合体/结构定义中字段声明的顺序很重要。 - user209051
9
@user209051:错误。假设你指的是图3-6(3-5是一个结构体),请注意位域的表示方式,低地址在右侧,高地址在左侧。填充发生在成员之后(即具有较高地址的成员之后)。 - Adam Rosenfield

-2

4
错误。请看我对我的答案的评论。 ELF ABI 对于 C 语言并不具有权威性或规范性。 - Adam Rosenfield

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接