结构体对齐和补齐(详细解释)

结构体的对齐和补齐的规则:
对齐:假定从零地址开始,每成员的起始地址编号,必须是它本身字节数的整数倍。
补齐:结构的总字节数必须是它最大成员的整数倍。
注意:在Linux系统下计算补齐、对齐时,成员超过4字节按4字节计算。

下面来举个例子:

#include <stdio.h>

typedef struct data
{
	char a[11];
	int b;
	char c;
	double d;
	short e;
}data;

int main()
{
	int size = sizeof(data);
	printf("%d\n",size);

	return 0;
}

上面这个程序的输出结果就是该结构体的大小,那么我们一步步计算一下这个结构体的大小。
1、首先第一个成员 char a[11],char类型是占一个字节的,所以第一个成员结束的地址范围是0~10,占了11个字节。 注意:地址的范围是假定从0开始的。

2、然后是第二个成员int b,int类型是占了4个字节的,然后第二个成员的起始地址是11,然后我们发现11不是4的倍数,所以这个时候我们要考虑对齐规则,即让起始地址是4的倍数,所以这里int b的起始地址是12,地址范围是12~15占了4个字节。

3、接着看第三个成员char c,因为char是占了一个字节,所以不需要考虑补齐和对齐,所以第三个成员占的地址是16,就一个字节。

4、再来看第四个成员double d,首先这里要注意一点在Linux系统下计算补齐、对齐时,成员超过4字节按4字节计算,这里我们默认是Linux系统下,当然在一般在别的系统下也有这个规则。然后这里的起始地址是17,不是4的倍数,所以我们要考虑对齐规则,即让double d的起始地址变成20,然后这里还要注意一点,double是4字节只是在对齐的时候需要考虑,在计算大小是还是要改成原来的8字节,所以第四个成员占的地址范围是20~27,占了8个字节。

5、最后再看第五个成员short e,short是占了2个字节的。起始地址是28,发现是2的倍数,所以不用再对齐了,所以占的地址范围是28~29,占了两个字节。

最后这个结构体的地址范围是0~29,大小是30个字节,但是我们在计算结构体大小的时候还有一条规则,就是补齐。在这个结构中最大的成员的字节数是4(超过4字节按4字节算),30不是4的整数倍,所以最后这个结构体的大小还要增加2,最后的结果就是32。

结果如图:
在这里插入图片描述

  • 18
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值