C 结构体大小计算

计算法则

  1. 结构体成员的偏移量,是其成员的大小的整数倍(0是被认为是所有数的整数倍)
  2. 结构体的大小必须是所有成员大小的整数倍
  3. 结构体中数组,结构体只计算其大小,不参与法则判定

1.结构体成员的偏移量,是其成员的大小的整数倍(0是被认为是所有数的整数倍)

对于char a,偏移量为0,大小为1,0为所有数整数倍
char b 偏移量为1,大小为1
int c 偏移量为2 大小为4,根据条件需要空出2个字节使得偏移量变为4,才为4字节整数倍
整个结构体大小为:a的1字节,b的1字节,c的4字节加上空出来的2字节,总共8字节

struct T1{	//偏移量	大小
	char a;	//0			 1
	char b; //1			 1
	int c;  //2			 4	(空出2个字节)
			//结构体大小: 1+1+2+4=8
};

2.结构体的大小必须是所有成员大小的整数倍

对于char a,偏移量为0,大小为1,0为所有数整数倍
int b 偏移量为1 大小为4,空出3个字节
char c偏移量为8字节,大小为1字节,目前总字节数是1+4+3+1 = 9,但9不是int型4 字节的整数倍,所以最小公倍数为12,结构体大小为12

struct T1{	//偏移量	大小
	char a;	//0			 1
	int b;  //1			 4	(空出3个字节)
	char c; //8			 1	
			//结构体大小: 1+4+3+1=9, 根据法则,9不是4的整数倍,所以为12
};

3.结构体含有数组

前两个变量还是一样的计算,字符不用考虑法则1,2,所以直接加上数组的大小,同时不考虑数组的偏移量与大小的关系

struct T1{		//偏移量	大小
	char a;		//0			 1
	int b;  	//1			 4	(空出3个字节)
	char c[13]; //8			13	(数组不包含在法则内,还是13个字节无空出字节)
			//结构体大小: 1+4+3+13=21, 根据法则,21不是4的整数倍,所以为24
};

3.结构体含有结构体

结构体内的结构体定义与否会影响整个和结构体大小,但任然不参与法则判定

  1. 对于解结构内的结构体,如果内部结构体声明了结构体却没定义,那么其大小不计算在整个结构体的大小内
struct T1{		//偏移量	大小
	char a;		//0			 1
	int b;  	//1			 4	(空出3个字节)
	struct T2{	//声明无大小
		char c;	
		int d; 	
	};
	float e;	//8			 4
				//1+4+3+4 = 12
};

如果不定义结构体T2变量,直接打印sizeof(struct T1),在Linux下会警告

在这里插入图片描述

  1. 前面a,b同理,结构体类型的成员变量继续偏移算结构体总大小,此时T2声明并定义了变量temp,易得T2结构体大小为8,e偏移了16字节,大小为4没有多余空出字节,所以大小为1+4+3+8(结构体)+4=20;
struct T1{		//偏移量	大小
	char a;		//0			 1
	int b;  	//1			 4	(空出3个字节)
	struct T2{				//整各大小为8
		char c;	//0			 1
		int d; 	//1			 4	(空出3个字节)
	}temp;
	float e;	//16			 4
				//1+4+3+1+4+3+4 = 20
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值