c语言联合体中字节对齐,[转]联合体的字节对齐问题

联合体的字节对齐问题

本文用三个简单的例子说明联合体的内存模型:

#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]);

}

运行结果如下:

a4c26d1e5885305701be709a3d33442f.png

的确,我们看到了这个预期的结果。

再来一个例子,如下:

#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]);

}

a4c26d1e5885305701be709a3d33442f.png

可见,我们就得到了预期的结果。结论如下图:

a4c26d1e5885305701be709a3d33442f.png

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

集成实验与学习环境中得到相同的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值