原網址:http://www.0ffff.com/sdy/ccpp-skill/ccpp-skill-struct-offset.html
如有以下結構體,我們怎麼知道這個結構體各個成員變量abc相對於本結構體的偏移地址呢?
typedef struct _MY_STRUCT
{
char a;
int b;
float c;
}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種方法
-
使用工具windbg 的 dt命令
輸入命令dt _MY_STRUCT
則windbg自動會輸出相關的偏移信息。
-
第二種方法是我們編程計算,使用取地址&來自動獲取。
代碼如下:
// t.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
typedef struct _MY_STRUCT
{
char a;
int b;
float c;
}MY_STRUCT, *PMY_STRUCT;
#define GetOffset(t, m) int(&(((t*)0)->m))
void main(int argc, _TCHAR* argv[])
{
int b = GetOffset(MY_STRUCT, b);
printf("%dn", b);
}
我們定義了一個宏GetOffset,將0地址強轉換成我們定義的結構體指針PMY_STRUCT,然後再用此指針獲取其成員變量的地址,因數本結構體是從0開始的,則獲取到的成員變量地址就是成員變量相對於結構體的偏移地址。
C/C++編程技巧盡在 http://www.0ffff.com/sdy/ccpp-skill/