联合体结构体嵌套

结构体联合体基础

下文转载博主为:关于结构体和联合体大小的计算_结构体和联合体字节计算_Monitor0913的博客-CSDN博客

一 .结构体

1:当没有定义 #pragma pack(value) 这种指定 value 字节进行对齐时,
它的计算规则是:整体的大小在满足为最大数据类型所占字节的倍数下要达到所占内存最小。
举例如下:
typedef struct
{
char a[5];
int b;
double c;
}Test;
没有指定字节对齐。在结构体成员中,a占5个字节,b占4个字节,c占8个字节。5+4+8=17.但是17不是 8的倍数,所以(5+3)+(4+4)+8=24.故占24个字节。

2:当定义了 #pragma pack(value),以 value字节进行对齐时,它的计算规则如下:
整体的大小必须为 value 的最小整数倍。举例如下:
#pragma pack(4)
typedef struct
{
char a[5];
int b;
double c;
}Test;
指定4字节对齐,所以(5+3)+4+8=20。故占20个字节。
#pragma pack(2)
typedef struct
{
char a[5];
int b;
double c;
}Test;
如果指定2字节对齐,那么就是(5+1)+4+8=18个字节。

二 .联合体

同样也分为两种情况:
1:当没有定义 #pragma pack(value) 这种指定 value 字节进行对齐时,它的计算规则是:
联合体中最大成员所占内存的大小且必须为最大类型所占字节的最小倍数。举例如下:
union
{
char a[7];
int b[2];
double c;
}Test;
成员a 占7字节,成员b 占 4*2=8 字节,成员c 占8字节,
最大类型字节数8,根据计算规则,该联合体的大小为 8字节。
union
{
char a[7];
int b[3];
double c;
}Test;
a占7字节,b占12字节,c占8字节。那么此联合体大小为16字节。
2:当定义了 #pragma pack(value),以 value字节进行对齐时,它的计算规则如下:
联合体中最大成员所占字节且必须为value的最小倍数。举例如下
#pragma pack(2)
union
{
char a[7];
int b[3];
double c;
}Test;
如果定义以2字节对齐,a占7字节,b占12字节,c占8字节,那么此联合体大小为12字节。

三.结构体嵌合联合体计算大小

1:当没有定义 #pragma pack(value) 这种指定 value 字节进行对齐时,它的计算规则是:
联合体按照最大成员所占字节且为最大数据类型所对应的字节的最小整数倍的原则进行计算,
它所占的字节数与结构体中其他成员所占字节的总和应为结构体中最大数据类型所对应的字节的最小倍数。

typedef struct
{
union
{
char a[10];
int b[2];
double c;
}test;
char d[5];
int e;
double f;
}Test;
联合体中a占10字节,b占8字节,c占8字节。此联合体大小为16字节,
那么结构体中 d占5字节,e占4字节,f占8字节。16+(5+3)+(4+4)+8=40.所以占40个字节。

2:当定义了 #pragma pack(value),以 value字节进行对齐时,它的计算规则如下:
联合体中最大成员所占字节且为value的最小整数倍,它所占的字节数与结构体其他成员所占字节数的总和为value的最小整数倍。
举例如下:
#pragma pack(2)
typedef struct
{
union
{
char a[10];
int b[2];
double c;
}test;
char d[5];
int e;
double f;
}Test;
联合体中a占10字节,b占8字节,c占8字节。10满足是2的最小倍数,此联合体大小为10字节。
此结构体大小为10+(5+1)+4+8=28字节。

开发代码实战

typedef union
	{
		Data[6];
		struct
			{
				unsigned char K;//1 byte
				unsigned char OverV:1;//1/8占一个字节里的第1bit
				unsigned char UnderV:1;
				unsigned char Respon_Err:1;
				unsigned char reserve1:5;//5/8
				unsigned char reserve2[4];
			}B;
	}X;			

(1)该联合结构体大小为:6 //Data[6]大小为0~5=>6
(2)​Data[0]​=K Data[2]=reserve2[1]
(3)在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值