C语言中结构体长度计算

结构体的长度并不是简单地将结构体地所有成员相加

它中间会出现偏移量,我们以下为例

现有如下结构体:

struct good
{
	char c;
	int id;
	char g;
	int shop;
	double price;
	int num;
	char rec[50];
}

我们假设初始地址开始为0

c的长度为1,0可以整除1,当c填充到内存后地址加1,即此时到了地址为1的位置

id的长度为4,地址位置1不可以整除4,所以在c填充到内存时需要加3,我们可以理解为c后面有3个空位,当id填充到内存后地址位置为8

g的长度为1,地址位置8可以整除1,当g填充到内存后地址加1,即地址位置为9

shop的长度为4,9不可以整除4,所以g的后面需要有3个空位,当shop填充到内存后地址为16

price的长度为8,16可以整除8,直接将其添加到内存中,此时地址为24

num的长度为4,24可以整除4,直接将其添加到内存中,此时地址为28

rec字符串我们可以理解为50个char的字符,因为char字符的长度为1,能被任何数整除,所以直接将其添加到内存中,此时地址为78

最后我们需要加上一个值,使最终这个结果能整除结构体最长成员的长度,在此结构体中最长成员的长度为8,即double类型(不是char rec[50],因为数组是由多个相同类型组成的),所以最终的结果为80

好像也有说最终结果必须是所有成员的公倍数,不过C语言中所有类型满足倍数关系,64位系统中如char(1),short(2),int(4),long long(8),float(4),double(8)。所以我们直接找长度最大的就可以了

这只是一个求结构体长度的方式,仅供参考!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值