我遇到了一些聯盟中的數據對齊問題,我似乎無法弄清楚。使用與下面類似的聯合,聯盟的基地址似乎有一些數據偏移。聯盟成員數據對齊
typedef union MyUnion
{
struct MyStruct
{
uint16_t val_1;
uint8_t val_2;
uint8_t val_3;
}data;
uint8_t data_array[4];
}MyUnion;
在某些時候,我在與數據填充結構,
my_union.data.val_1 = 65535;
my_union.data.val_2 = 0;
my_union.data.val_3 = 0;
然後我嘗試使用數組來訪問數據。我期望在數組的基地址處看到的是val_1的第一個字節,255。但是,當訪問數組中的數據時,它似乎偏離了結構的基數1個字節。
printf("Bytes of struct: %#08x\n", my_union.data.val_1);
printf("Bytes of array: %#08x\n", my_array.data_array[0]);
無論什麼樣的價值觀,我把在輸出上述結果與此類似。
Bytes of struct: 0x00ffff
Bytes of array: 0x0000ff
我首先想到的是,會員可在某種程度上抵消並引用不同的內存地址的,但是當我打印的地址,它們是相同的。
此外,如果我打印下面的值他們是平等的。
printf("Bytes of struct: %#08x\n", my_union.data);
printf("Bytes of array: %#08x\n", *(my_array.data_array - 1));
輸出:
Bytes of struct: 0x00ffff
Bytes of array: 0x00ffff
我敢肯定,我失去了一些東西簡單,但我無法弄清楚,此刻。感謝您提前提供任何幫助。
你應該會得到錯誤。發佈sscce,而不是代碼片段。 – this
如何與下面的「類似」是你實際使用的聯盟?你真的可以用你在問題中展示的聯盟重現問題嗎?你能展示編譯的完整但最少的代碼及其產生的輸出,並確定你正在運行它的編譯器和平臺嗎?您選擇的值對於診斷問題並不是很好;您應該考慮將(例如)0xFEDC分配給'val_1',也許將0xBA分配給'val_2',將0x89分配給'val_3'。請參閱MCTRE/MCVE [如何創建一個最小,完整,測試和可讀的示例](http://stackoverflow.com/help/mcve) –
@JonathanLeffler它是相當不同的,結構包含一些奇怪的數據類型,即位字段結構,但是工會中結構的第一個成員是一個無符號短整型。我正在使用MinGW GCC 4.6.2。該平臺是Altera的RISC軟核處理器,稱爲Nios II。對不起,關於示例中的值。我使用了其中可以分別跟蹤字節的數據,並顯示了上面的行爲。數組數據始終與結構數據偏移一個字節。 – dsell002