我们知道,C编译器在编译32位机目标代码时,默认将变量存储的地址按照4字节进行对齐。
在使用结构体时,由于字节对齐的原因可能会造成存储空间的浪费
例如:
struct AA{
char a;
int b;
char c;
}aa
结果,sizeof(aa)=12。成员a与b之间空出了3个空字节,成员c也后也空出了3个字节。
这个时候虽然内存空间有些浪费,但是并不会误导程序员进行编码。如果和联合体一起使用,就可能会造成一定的误解。
例如:
struct AA{
union{
struct{
char Byte0;
char Byte1;
char Byte2;
char Byte3;
};
int data;
}
}aa
此处本来想将 Byte0 -Byte3作为 data的4个字节的重名以便对data的其中任意8bit进行操作。但是由于四字节对齐的原因只有Byte0是data的第0字节,Byte1-Byte3每一个成员都向后偏移了四个字节。
为了达到预期的效果,可以使用#pragma pack(n) 对编译器进行字节对齐设置。
struct AA{
union{
struct{
char Byte0;
char Byte1;
char Byte2;
char Byte3;
};
int data;
}
}aa
struct AA{
char a;
char b;
char c;
}aa
struct _cc{
union{
struct{
char Byte0;
char Byte1;
char Byte2;
char Byte3;
};
int data;
}
}cc
aa.b = 0x02;//此处给成员b赋值失败
#pragma pack()//取消对齐设置
struct _cc{
union{
struct{
char Byte0;
char Byte1;
char Byte2;
char Byte3;
};
int data;
}
}cc