C语言字节对齐方式

看一个小程序如下:

struct  S

{

char  c1;

int   i;

char  c2

};

那么这个结构体在计算 sizeof(S) 的值是多少呢?

是不是1+4+1=6?

答案当然不是 6,这是由于sizeof 在计算字节的时候会有一个字节对齐准则:

1、结构体变量的首地址能够被其成员里面,字节最宽的基本类型成员所整除;

2、结构体的每个成员相对于结构体首地址的偏移量,都是成员大小的整数倍,如有需要,编译器会在成员之间加上填充字节

3、结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节


所以上面的结构体中,c1的偏移量为1,i 的偏移量为1+4=5,c1与 i 之间需要填充3个字节,为3+5=8,恰好是整形变量 i 字节大小的整数倍。 c2 的偏移量为9,恰好是c2 一个字节的整数倍,所以不用另外填充字节,加起来就是1+3+4+1=9个字节。 由于这里面最宽基本类型为 int,为4个字节,所以需要另外填充3个字节凑成4的倍数。这样一共是12个字节。

(当到目前变量的总共字节数,不是目前变量的整数倍的时候,需要填充字节,使得总数目是目前字节的整数倍,比如:int  i,到 int  i 这里的时候总共是5个字节,而 int 型占用的是4个字节,所以需要另外填充 3 个字节,总共是 8 个字节才是 int  的整数倍,而到 char  c2的时候,总共是9个字节,恰好是 char 型变量大小的整数倍,所以不用另外增加字节)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Micrle_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值