带联合的sizeof结构

时间:2013-12-12 03:12:20

标签: c struct sizeof

我对整个'数据对齐'事情感到非常困惑:

#include <stdio.h>
int main(){
    struct st{
        int i,*p;
        char c;
        union { char type[4]; unsigned char d;} un; 
    };

    struct st s1={25,&a,'X',"asdf"};
    printf("sizeof s1 is %d",sizeof(s1));
    return 0;
}

由于数据对齐,我认为自大小以来

int i : 4 bytes
int *p : 8 bytes
char c : 1 byte(+3)
union : 4 bytes

输出为20,但输出sizeof s1 is 24! 为什么输出24?这是否考虑int * p,即8个字节?

2 个答案:

答案 0 :(得分:1)

在您的系统上,指针是8个字节并且对齐到8个字节。

  1   2   3   4   5   6   7   8
+---+---+---+---+---+---+---+---+
| int i         | [pad]         |
+---+---+---+---+---+---+---+---+

  9  10  11  12  13  14  15  16
+---+---+---+---+---+---+---+---+
| int *p                        |
+---+---+---+---+---+---+---+---+

 17  18  19  20  21  22  23  24
+---+---+---+---+---+---+---+---+
| c | un            | [pad]     |
+---+---+---+---+---+---+---+---+

当然,如果不知道ABI,就无法确定确切的布局。以上只是一个例子。

答案 1 :(得分:0)

在您使用的体系结构上,int *p为8个字节,但也需要在8字节边界上。这为ip之间提供了4个字节的填充。此外,因为int *p需要在8字节边界上,所以整体结构需要是8字节的倍数,这样它们的数组总是具有p的正确对齐。

所以,你最终会得到这样的布局:

  • i:4个字节,对齐4
  • pad:4个字节
  • p:8个字节,对齐8
  • c:1个字节
  • un:4个字节(因为它可以保持字节对齐)
  • pad:3个字节(将其四舍五入为8字节边界)