9.11 结构体元素偏移
//int 占 2 个字节,char 占 1 个字节,float 占 4 个字节
struct stu{
union{
char bj[5];
int bn[2];
}class;//5
char xm[8];//8
float cj;//4
}xc;
问题:求sizeof(xc)?
我的答案:32
正确答案:20
分析:
无论结构体还是联合体,都讲究一个字节对齐,按照其内部最大元素内存大小对齐!!!
所以union中最大元素类型是int,这里是2字节,所以union按照2字节对齐,char bj[5]占了5字节,按照2字节对齐的时候再补一个字节,所以union的大小是6Byte;在struct中,class已经占了前6字节,char xm[8]中每一个char占1字节,所以char数组可以紧接着存放8个字节,现在内存大小为6+8=14字节,由于float需要4字节对齐,所以float从第16字节开始存储,占用4字节。至此struct内存大小占用20字节!
注意:结构体涉及数组的时候,我觉得可以把数组拆分开看作一个个元素,就好多了,只出现数组是不可以按照数组整体来内存对齐的.
结构体定义如下:
//int 占 2 个字节,char 占 1 个字节,float 占 4 个字节
struct stu{
union{
char bj[5];
int bn[2];
}class;//5