定義一個結構體,其第一個成員為 char 類型。在主函數中創建該結構體對象,並嘗試獲取該 char 成員的地址並打印。在 Windows XP 及 Android AIDE 環境下均顯示亂碼(如負數地址 -2639232),但若將首個成員改為 int 等 4 字節類型則能正常輸出地址。
// 示例輸出地址差值
-2639232 // char 成員地址
-2639228 // 下一個 int 成員地址(差 4 字節)
-2639220 // 再下一個 int 成員地址(差 4 字節)
char 只有 1 字節,但編譯器為了訪問效率,會在其後填充 3 字節 padding,導致下一個成員起始地址相差 4 字節。%d(有符號整數)打印指針,會被解釋為負數。應使用 %p 並轉型為 void*。struct Demo { char c; int a; double d; };
Demo obj;
printf("char 地址: %p\n", (void*)&obj.c);
printf("int 地址: %p\n", (void*)&obj.a);
printf("double 地址: %p\n", (void*)&obj.d);
%p + (void*),不要用 %d、%x 或 %ld。#pragma pack(n) 或 __attribute__((packed)) 可控制對齊,但可能降低訪問性能。