c语言中结构体大小的计算

定义

结构体中的偏移量

结构体中的偏移量是一个成员的实际地址和结构体首地址之间的距离。

结构体大小计算

结构体大小 会涉及到字节对齐(目的是 让计算机快速读写
以空间换取时间)。即,最后一个成员的偏移量加上最后一个成员的大小再加上末尾的填充字节数。

结构体内偏移规则

1、每个成员的偏移量都必须是当前成员所占内存大小的整数倍如果不是编译器会在成员之间加上填充字节。
2、当所有成员大小计算完毕后,编译器判断当前结构体大小是否是结构体中最宽的成员变量大小的整数倍 如果不是会在最后一个成员后做字节填充。

struct unknown {
    int a;
    char b;
    int c;
    long d;
    char e;
};
printf("%lu\n", sizeof(struct unknown));
//output : 32123456789

结构体重共有一个long类型,两个char类型,两个int类型成员。如果只按照这几个成员大小相加,结构体大小应该是
4+1+4+4+1=14个字节大小。但实际上该结构体是20个字节大小。

下面来一步步分析编译器是如何计算大小进行分配的。(以下未标明单位的数字以字节为单位)

1、遇到第一个成员变量a,该成员偏移量为0,大小为4,符合偏移规则第一条。
2、接下来第二个成员变量b,偏移量为4,大小为1,符合偏移规则第一条。
3、成员变量c,偏移量为5,大小为4,不符合偏移规则第一条。在成员b和c之间填充三个字节,此时,偏移量大小为8,符合偏移规则第一条,继续往下。
4、成员变量d,偏移量为12,大小为4,,符合偏移规则第一条,继续往下。
5、成员变量e,偏移量为16,大小为1,符合偏移规则第一条。
6、所有成员大小计算完后,执行偏移规则第二条,最宽的类型是d,long类型,4个字节,当前结构体计算出的大小为17,并不符合第二条规则,于是在末尾填充3个字节,总大小为20个字节,满足第二条偏移规则。到此结构体大小计算结束。


版权声明:本文为CSDN博主「Iconoclast_wu」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012807459/article/details/48545141

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值