关于共用体的疑问

[复制链接]
2324|3
 楼主| ahong007 发表于 2008-3-17 10:58 | 显示全部楼层 |阅读模式
<br />请教各位大虾<br />在头文件里定义了一个共用体<br />struct&nbsp;Var_All&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;ii;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;jj;<br />}&nbsp;;<br /><br />union&nbsp;{<br />&nbsp;&nbsp;unsigned&nbsp;int&nbsp;var_int[3];<br />&nbsp;&nbsp;struct&nbsp;Var_All&nbsp;all_var;<br />}&nbsp;MYMODBUS;<br /><br /><br /><br />在主程序里随便赋值运行<br />MYMODBUS.all_var.ii=0x0102;<br />MYMODBUS.all_var.jj=0x05060708;<br /><br />看了一下watch窗口,发现<br />MYMODBUS.all_var.ii和MYMODBUS.all_var.jj都是对的;但<br />MYMODBUS.var_int[0]=0x0102;<br />MYMODBUS.var_int[1]=0x0001;<br />MYMODBUS.var_int[2]=0x0708;<br />为什么不是MYMODBUS.all_var.jj与MYMODBUS.var_int[1]、MYMODBUS.var_int[2]同一个储存地址呢?<br /><br />如果联合体里的数组定大一点如unsigned&nbsp;int&nbsp;var_int[4];则<br />MYMODBUS.var_int[0]=0x0102;<br />MYMODBUS.var_int[1]=0x0001;<br />MYMODBUS.var_int[2]=0x0708;<br />MYMODBUS.var_int[3]=0x0506;<br /><br />MYMODBUS.all_var.jj与MYMODBUS.var_int[2]、MYMODBUS.var_int[3]同一个储存地址,真是怪事了。
liudewei 发表于 2008-3-17 13:32 | 显示全部楼层

联合体内不能有结构体!

可以定义,但分配单元的时候结构体是按结构体内部最大单元的大小分配存储空间的。
dld2 发表于 2008-3-17 14:00 | 显示全部楼层

还有这种说法?

没这样用过。
djyos 发表于 2008-3-17 20:04 | 显示全部楼层

对齐惹的祸

你把ii和jj位置对调,肯定就对了。<br />编译器分配内存时,给struct&nbsp;Var_All型变量分配的不是3个int,而是4个int长度的内存,ii和jj之间有一个int类型的空隙。因此成员jj对应var_int[2,3](越界了),不是var_int[1,2]。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

120

主题

337

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部