C语言 如何计算结构体的大小

无嵌套结构体的大小计算

如何计算结构体的大小?

由于存储变量地址对齐的问题,计算结构体大小的3条规则:
1、结构体变量的首地址,必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍。(对齐)
2、结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节的整数倍。(对齐)
3、结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节数”的整数倍(补齐)

计算下面结构体的大小

struct Test1
{
	int b;
	double c;	
	long d;
}Test1;
int main()
{
	printf("size = %d\n", sizeof(Test1));
	return 0;
}

在这里插入图片描述
计算流程:当计算结构体大小时,为了方便计算,初始地址假设为0,int占了4个字节,总开辟的空间为4,因为要和下面的double类型对齐,double的起始地址必须为8,所以绿色部分为因对齐而另开辟的空间,double占了8个字节,所以现在总开辟的是16个字节,long的字 节为4, 16是4的倍数,所以long的起始地址为16,long占了4个字节,此时共开辟了20个字节大小的空间。因为最后面没有类型了,结构体变量的总大小要根据结构体变量中最大基本数据类型对齐,20要跟8对齐,但是20不是8的整数倍,所以在long的后面再开辟4个字节,所以最后一共开辟了24个字节。

程序运行结果

在这里插入图片描述

计算含有数组的结构体大小

计算含有数组的结构体大小时,需要注意的是,如果下一个成员是数组,则不需要偏移,只要连续开辟空间。
计算下面结构体的大小

typedef struct Test2
{
	char c[10];
	char ca[5];
	int a;

}Test2;

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

	return 0;
}

在这里插入图片描述

计算流程:起始地址为0,char c[9]占了9个字节的空间,因为下一个成员也是数组,所以不用对齐,直接在地址9这里开辟一个数组char ca[5],占了5个字节,此时是占了14个字节,但是下一个成员是int类型,14不是4的整数倍,所以要从16地址开始存放int a,int占了4个字节,所以总开辟了20个字节,随后,结构体的总大小必须是结构体里最大基本类型的整数倍,这里为int 4个字节,20是4的整数倍,不用补齐,所以此结构体最总开辟了20个字节。

程序运行结果
在这里插入图片描述

计算嵌套结构体的大小

计算下面结构体的大小

typedef struct Test3
{
	short a;
	struct
	{
		int b; 
		double c;
		long d;
	};
	int e; 
}Test2;

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

	return 0;
}

在这里插入图片描述

计算流程:起始地址位置为0,short类型占了2个字节,下面的一个成员类型为结构体,此时要与嵌套的结构体里最大的基本类型,也就是和double 8字节对齐,所以另开辟空间6个,此时地址8是8的倍数,可以存放结构体,这里计算里面的结构体的大小为24,所以8+24=32,所以此时一共占了32个字节空间的大小,最后一个int类型,32是4的整数倍,所以int就直接存在结构体类型的后面,32+4=36,最后要和结构体最大的基本数据类型补齐,里面的结构体的类型也算。所以要与double 8补齐,36不是8的倍数,随后另开辟4个字节空间。所以最后结构体的总大小为40.

程序运行结果
在这里插入图片描述
如有疑问或者其它更好的方法,可以在下面评论区留言

  • 79
    点赞
  • 140
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

WhiteShirtI

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

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

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

打赏作者

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

抵扣说明:

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

余额充值