在處理某些框架結構時,我遇到了一個奇怪的行爲。 我迅速用以下測試它與獨立樣本代碼:奇怪的結構包裝
struct non_alligned_struct
{
uint8_t flag;
// start of uint32 bit fields
uint32_t a:2;
uint32_t b:2;
uint32_t c:1;
uint32_t d:1;
uint32_t e:1;
uint32_t f:1;
uint32_t g:3;
uint32_t h:1;
uint32_t i:1;
uint32_t j:3;
uint32_t k:3;
uint32_t l:1;
uint32_t m:1;
uint32_t n:1;
uint32_t o:1;
uint32_t p:3;
uint32_t q:2;
uint32_t r:1;
uint32_t s:1;
uint32_t t:2;
//4 bytes ends here
// shouldn't this start at 5th byte ??
uint16_t u;
uint16_t v:13;
uint16_t w:3;
uint16_t x;
uint16_t y:13;
uint16_t z:3;
};
int main()
{
struct non_alligned_struct obj1;
void *ptr1 = &obj1;
void *ptr2 = &(obj1.u);
printf("ptr1: %p, ptr2: %p, ptr2 - ptr1: %d\n", ptr1, ptr2, ptr2 - ptr1);
return 0;
}
輸出: PTR1:0x7fff3216a620,PTR2:0x7fff3216a626,PTR2 - PTR1:6
問:爲什麼PTR2 - ptr1的應該是6。根據我的計算,它應該是5.此外結構是13個字節,所以它得到4個字節對齊,填充是以奇怪的方式完成的。我通過給成員變量給出隨機值驗證,我觀察到填充在以下大膽地點
00000000進行:01 22 31 10 67 FE FF 86 01 FE FF 86 01
ptr2-ptr1絕對等於6 ... – DigitalNinja
在MSVC中,如果我用'#pragma pack(push,1)'和'#pragma pack(pop)'封裝了'struct',它會給出預期的結果'5'否則'8'。我不得不將'void *'指針改爲'char *',因爲'void *'類型的指針運算是實現定義的。 –
約束違規對'void *'進行算術運算。您的編譯器有義務爲此錯誤發佈診斷。 – EOF