联合体的字节对齐问题
本文用三个简单的例子说明联合体的内存模型:
#include
void main() { union
{
short int i; //占两个字节
char a; //占一个字节
char ch[2]; //占两个字节
}temp;
temp.i=0; //清空联合体的内容 temp.a=123;
temp.a=123; //首先给这个赋值,如果temp.a在(temp.i)
的低字节即是123,且ch[1]=0,ch[0]=123
printf("sizeofnuion=%d\n",sizeof(temp));//输出联合体所占的内存字节数
printf("temp.a=%d\n",temp.a);
printf("temp.i=%d\n",temp.i);
printf("temp.ch[1]=%d\n",temp.ch[1]);
printf("temp.ch[0]=%d\n",temp.ch[0]);
}
运行结果如下:
的确,我们看到了这个预期的结果。
再来一个例子,如下:
#include
void main()
{
union
{
short int i;
char a;
char ch[2];
}temp;
temp.i=0; //清空联合体的内容
temp.i=256; //赋这个数值是为了让低字节全用0填充,以便更好看出内存的分配状态
//的低字节是8个零,高字节的最低位就是1了,于是有temp.ch[1]=1,temp.ch[0]=0;temp.a=0;temp.i=256
printf("sizeofnuion=%d\n",sizeof(temp)); //输出联合体所占的内存字节数
printf("temp.a=%d\n",temp.a);
printf("temp.i=%d\n",temp.i);
printf("temp.ch[1]=%d\n",temp.ch[1]);
printf("temp.ch[0]=%d\n",temp.ch[0]);
}
可见,我们就得到了预期的结果。结论如下图:
void main()
{
union{short int i;char a;char ch[2];}temp;
temp.i=0;
// temp.a=123;
temp.i=256;
printf("sizeofnuion=%d\n",sizeof(temp));
printf("temp.a=%d\n",temp.a);
printf("temp.i=%d\n",temp.i);
printf("temp.ch[1]=%d\n",temp.ch[1]);
printf("temp.ch[0]=%d\n",temp.ch[0]);
printf("\n");
temp.i>>=4; //向右移4位后,位置8的“1”就到了位置4,此时ch[0]=16 ch[1]=0
//
temp.i<<4; //向左移4位后,位置8的“1”就到了位置12,此时,ch[0]=0 ch[1]=16
printf("temp.a=%d\n",temp.a);
printf("temp.i=%d\n",temp.i);
printf("temp.ch[1]=%d\n",temp.ch[1]);
printf("temp.ch[0]=%d\n",temp.ch[0]);
}
有兴趣的友友上机调试下就清楚了,本实验在VC++6.0和Turbo C for Windows
集成实验与学习环境中得到相同的结果。