C 结构填充。嵌套结构

标签 c compiler-construction struct padding

struct Y{
  int int_one;
  int int_two;
  void * pointer;
}

struct X{
    char char_one;
    char char_two;
    struct Y y_structures[20];
 }

填充在 32 位和 64 位机器上是不同的。我不知道为什么。 据我所知,填充应该如下:

 0x0 char_one <br>
 0x1 char_two <br>
 0x4 y_structures[0].int_one <br>
 0x8 y_structures[0].int_two <br>
 0x12 y_structure[0].pointer <br>

32 位的结构与上面提到的类似,但在 64 位机器上,char_twoy_structures[0].int_one 的地址之间的差异是 7 个字节。我认为它应该是 3 个字节,因为在 char_two 之后要对齐的类型是 y_structures[0] 的一个 int 并且它的大小在两种架构上都是 4。请帮忙

最佳答案

问题不在于 int,而在于指针。指针在 64 位机器上的大小为 8 字节,因此它们必须从内存地址 mod 8 开始。

0x0 char_one
0x1 char_two
0x8 y_structures[0].int_one
0x12 y_structures[0].int_two
0x16 y_structure[0].pointer
0x24 y_structures[1].int_one
0x28 y_structures[1].int_two
0x32 y_structure[1].pointer
...

所以必须有6个填充字节。这在 32 位机器上没有必要,因为指针只有 4 个字节。

关于C 结构填充。嵌套结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25378140/

相关文章:

c# - 程序集中类的顺序

c - 在 C 中从文本文件读/写到链表

c - select() 返回无效参数

c - 结构和代码解释

c - 使用通过 MacPorts 安装的 GD2 库通过 GCC 编译 C 程序的问题

c++ - C++编译器创建的符号表

c - ‘names’ 的存储大小未知

java - JNA 通过引用传递结构帮助

c - 流和 llvm 错误

c - 需要展开循环宏