结构体联合体基础
下文转载博主为:关于结构体和联合体大小的计算_结构体和联合体字节计算_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)