打印

关于共用体的疑问

[复制链接]
1634|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ahong007|  楼主 | 2008-3-17 10:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

请教各位大虾
在头文件里定义了一个共用体
struct Var_All {
        unsigned int ii;
        unsigned long jj;
} ;

union {
  unsigned int var_int[3];
  struct Var_All all_var;
} MYMODBUS;



在主程序里随便赋值运行
MYMODBUS.all_var.ii=0x0102;
MYMODBUS.all_var.jj=0x05060708;

看了一下watch窗口,发现
MYMODBUS.all_var.ii和MYMODBUS.all_var.jj都是对的;但
MYMODBUS.var_int[0]=0x0102;
MYMODBUS.var_int[1]=0x0001;
MYMODBUS.var_int[2]=0x0708;
为什么不是MYMODBUS.all_var.jj与MYMODBUS.var_int[1]、MYMODBUS.var_int[2]同一个储存地址呢?

如果联合体里的数组定大一点如unsigned int var_int[4];则
MYMODBUS.var_int[0]=0x0102;
MYMODBUS.var_int[1]=0x0001;
MYMODBUS.var_int[2]=0x0708;
MYMODBUS.var_int[3]=0x0506;

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位置对调,肯定就对了。
编译器分配内存时,给struct Var_All型变量分配的不是3个int,而是4个int长度的内存,ii和jj之间有一个int类型的空隙。因此成员jj对应var_int[2,3](越界了),不是var_int[1,2]。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

120

主题

337

帖子

7

粉丝