C/C++技巧 結構體成員偏移

 原網址:http://www.0ffff.com/sdy/ccpp-skill/ccpp-skill-struct-offset.html

如有以下結構體,我們怎麼知道這個結構體各個成員變量abc相對於本結構體的偏移地址呢?

  1. typedef struct _MY_STRUCT
  2. {
  3. char a;
  4. int b;
  5. float c;
  6. }MY_STRUCT, *PMY_STRUCT;

當然有人說了,這是是很簡單嗎?我們可以手動計算,如下:
第一個成員變量是個char ,佔一個字節,第二個成員變量是int,佔4字節,但因爲系統會進行字節對齊,故b的偏移地址是4,因爲a後面又補了3個字節,第三個成員是個float型,佔4個節節,
故其成員結構體信息如下:

成員 偏移地址 實際佔大小 有效大小
a 0 4 1
b 4 4 4
c 8 4 4

當然這樣做是沒有任何問題的,但如果這個結構體很大,而且是結構體內嵌和,那該怎麼辦呢?
答案是有2種方法

  1. 使用工具windbg 的 dt命令
    輸入命令

    1. dt _MY_STRUCT

    則windbg自動會輸出相關的偏移信息。

  2. 第二種方法是我們編程計算,使用取地址&來自動獲取。
    代碼如下:

  1. // t.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6. typedef struct _MY_STRUCT
  7. {
  8. char a;
  9. int b;
  10. float c;
  11. }MY_STRUCT, *PMY_STRUCT;
  12.  
  13. #define GetOffset(t, m) int(&(((t*)0)->m))
  14.  
  15. void main(int argc, _TCHAR* argv[])
  16. {
  17.  
  18. int b = GetOffset(MY_STRUCT, b);
  19. printf("%dn", b);
  20. }

我們定義了一個宏GetOffset,將0地址強轉換成我們定義的結構體指針PMY_STRUCT,然後再用此指針獲取其成員變量的地址,因數本結構體是從0開始的,則獲取到的成員變量地址就是成員變量相對於結構體的偏移地址。

 

 C/C++編程技巧盡在 http://www.0ffff.com/sdy/ccpp-skill/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章