struct和union的大小

本文详细介绍了结构体默认对齐方式的三个核心条件:成员地址的偏移量、内部填充字节(internal padding)和尾部填充字节(trailing padding)。通过具体的结构体实例,解释了offsetof函数的应用及如何计算结构体的总大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结构体默认对齐方式
在默认对齐方式下,结构体成员的内存分配满足下面三个条件

1.第一个成员的地址和结构体的首地址相同,即偏移量为0。
2.结构体每个成员地址相对于结构体首地址的偏移量(offset)是该成员大小的整数倍,如果不是则编译器会在成员之间添加填充字节(internal adding)。
3.结构体总的大小是其成员中最大基本类型大小整数倍,如果不是编译器会在其末尾添加填充字节(trailing padding)。

offsetof函数可以得到结构体成员相对于该结构体首地址的偏移量


struct s0{
}//sizeof(s0)=1

struct s1{
    char ch;         //offsetof(s1, ch)=0; 
    int a;           //offsetof(s1, a)=4
    double b;        //offsetof(s1, b)=8
    char c1;         //offsetof(s1, c1)=16
}; //sizeof(s1)=24

struct s2{
    char ch;         //offsetof(s2, ch)=0
    int a;           //offsetof(s2, a)=4;
    double b;        //offsetof(s2, b)=8;
}; //sizeof(s2)=16
struct s3{
    char k0;             //offsetof(s3, k0)=0
    char k1[9];         //offsetof(s3, k1)=1
    double k2;          //offsetof(s3, k2)=16
};//sizeof(s3)=24

struct s4{
    char k0;             //offsetof(s4, k0)=0
    char k1[9];         //offsetof(s4, k1)=1
    char k2;            //offsetof(s4, k2)=10
};//sizeof(s4)=11

sizeof( struct ) = offsetof( last item ) + sizeof( last item ) + sizeof( trailing padding )

union类型满足1和3,所有成员偏移量都为0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值