您好!
该问题只会在结构中使用 unsigned long 并且只在结构大小大于特定 threashold 的情况下出现(9?)
测试过的编译器
16.9.10 LTS
20.2.5 LTS
示例:
在工作代码中、outside Var 的地址为: 0x00008306
这是正确的、因为先前的变量 W3具有地址:0x00008305
在有错误的代码中、outside Var 的地址为: 0x00008320
这是不正确的、因为先前的变量 W10具有地址:0x0000831E
因此、compier 让0x0000831F 留空。 然而、你可以在变量"all"中看到这个地址、所以这个运行状态可能会成为 memcopy 例程的危险
代码工作正常
typedef union _TMP
{
struct
{
union
{
struct
{
unsigned short w0;
unsigned short w1;
unsigned short w2;
unsigned short w3;
} EXPANDED;
struct
{
unsigned long w0_w1;
unsigned short w2_w3[2];
} COMPRESSED;
unsigned short all[4];
} SUBSYSTEM;
unsigned short outsideVar;
}expand;
unsigned short all[5];
} TMP;
带错误的代码:
typedef union _TMP
{
struct
{
union
{
struct
{
unsigned short w0;
unsigned short w1;
unsigned short w2;
unsigned short w3;
unsigned short w4;
unsigned short w5;
unsigned short w6;
unsigned short w7;
unsigned short w8;
unsigned short w9;
unsigned short w10;
} EXPANDED;
struct
{
unsigned long w0_w1;
unsigned short w2_w18[9];
} COMPRESSED;
unsigned short all[11];
} SUBSYSTEM;
unsigned short outsideVar;
}expand;
unsigned short all[12];
} TMP;