C中结构的大小

Rao*_*722 3 c memory struct sizeof

好吧,在用一个char,一个double,一个int读取这个结构的大小,我仍然没有得到我的struct的大小:

struct s {
   char c1[3];
   long long k;
   char c2;
   char *pt;
   char c3;
}
Run Code Online (Sandbox Code Playgroud)

sizeof(struct s)回报我40

但根据我提到的帖子,我认为记忆应该是这样的:

  0   1   2   3   4   5   6   7   8   9   a   b   c   d   e   f
+-------------+- -+---------------------------+- - - - - - - -+
| c1          |   |k                          |               |
+-------------+- -+---------------------------+- - - - - - - -+
 10  11  12  13  14  15  16  17
+---+- -+- -+- - - - - -+----+
|c2 |   |pt |           | c3 |
+---+- -+- -+- - - - - -+----+
Run Code Online (Sandbox Code Playgroud)

我应该18而不是40......有人可以向我解释我做错了什么吗?非常感谢你 !

Jon*_*ler 6

假设一个8字节的指针大小和对齐要求long long和指针,那么:

  • 3个字节 c1
  • 5个字节填充
  • 8个字节 k
  • 1个字节 c2
  • 7个字节填充
  • 8个字节 pt
  • 1个字节 c3
  • 7个字节填充

这相当于40个字节.

分配尾随填充,以便结构的数组保持结构的所有元素正确对齐.

请注意,大小,对齐要求以及填充因此取决于计算机硬件,编译器和平台的ABI(应用程序二进制接口).我使用的规则是通用规则:需要在N字节边界上分配N字节类型(对于{1,2,4,8,16}中的N).数组(在结构的结构和数组中)也需要正确对齐.你有时可以用#pragma指令填充; 要小心.通常最好在开始时布置具有最严格对齐的对象的结构,并且在末端布置不那么严格对齐的对象.

如果您使用:

struct s2 {
   long long k;
   char *pt;
   char c1[3];
   char c2;
   char c3;
};
Run Code Online (Sandbox Code Playgroud)

所需的大小只有24个字节,只有3个字节的尾随填充.订单确实很重要!