我正在使用一個本地無符號長變量作爲緩衝區,用於在其中包含兩個無符號短變量。從我對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