我正在使用一个本地无符号长变量作为缓冲区,用于在其中包含两个无符号短变量。从我对C++的知识来看,它应该是一个有效的方法。我用这种方法在一次无符号短内部多次存储2个unsigned char,没有任何问题。不幸的是,当在不同的架构上使用它时,它的反应很奇怪。它似乎在第二次分配后更新该值。 (溢出)案例就是为了演示它。任何人都可以阐明为什么它会这样反应吗?类型转换后的值不正确
unsigned long dwTest = 0xFFEEDDCC;
printf("sizeof(unsigned short) = %d\n", sizeof(unsigned short));
printf("dwTest = %08X\n", dwTest);
//Address + values
printf("Addresses + Values: %08X <- %08X, %08X <- %08X\n", (DWORD)(&((unsigned short*)&dwTest)[0]), (((unsigned short*)&dwTest)[0]), (DWORD)(&((unsigned short*)&dwTest)[1]), (((unsigned short*)&dwTest)[1]));
((unsigned short*)&dwTest)[0] = (WORD)0xAAAA;
printf("dwTest = %08X\n", dwTest);
((unsigned short*)&dwTest)[1] = (WORD)0xBBBB;
printf("dwTest = %08X\n", dwTest);
//(Overflow)
((unsigned short*)&dwTest)[2] = (WORD)0x9999;
printf("dwTest = %08X\n", dwTest);
的Visual C++ 2010的输出(OK):
sizeof(unsigned short) = 2
dwTest = FFEEDDCC
Addresses + Values: 0031F728 <- 0000DDCC, 0031F72A <- 0000FFEE
dwTest = FFEEAAAA
dwTest = BBBBAAAA
dwTest = BBBBAAAA
ARM9 GCC crosstool的输出(不工作):
sizeof(unsigned short) = 2
dwTest = FFEEDDCC
Addresses + Values: 7FAFECD8 <- 0000DDCC, 7FAFECDA <- 0000FFEE
dwTest = FFEEDDCC
dwTest = FFEEAAAA
dwTest = BBBBAAAA
编译启用警告('-Wall')并查看警告。然后在这里环顾这个“严格别名”(解决方案:使用联盟)。 – ninjalj