1 #include <Windows.h> 2 #include <stdio.h> 3 struct tagCONTAINING_RECORD 4 { 5 int a; 6 char b; 7 int c; 8 int d; 9 }; 10 // 使用 CONTAINING_RECORD 11 void test(char* cb) 12 { 13 tagCONTAINING_RECORD *t = CONTAINING_RECORD(cb, tagCONTAINING_RECORD, b); 14 printf("test中a:%d b:%c c:%d d:%d\n", t->a, t->b, t->c, t->d); 15 t->a = 10; 16 } 17 // 詳解 18 //這是如何作到的呢?咱們來看看CONTAINING_RECORD的表達式: 19 //((type *)( (PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field))) 20 //咱們看最後一部分(&((type *)0)->field)將0空指針轉成type取地址在本例 21 //就是將空指針轉成ABCD*而後指向b這個變量而後在取地址,這個操做的做用就是 22 //假設ABCD開始在0x000000內存位置上分配內存在此基礎上求b的內存地址,說白了 23 //就是求得b的內存結構體對齊偏移量,OK求得b的地址咱們轉成ULONG_PTR類型,而後用實際 24 //b的內存地址減去b的結構體偏移量求得結構體首地址。 25 26 void detail(char* cb) 27 { 28 printf("詳解\n"); 29 tagCONTAINING_RECORD *pT = (tagCONTAINING_RECORD*)0; 30 char* pB = &pT->b; 31 ULONG_PTR offset = (ULONG_PTR)pB; 32 printf("b的偏移值%d\n", offset); 33 tagCONTAINING_RECORD *pF = (tagCONTAINING_RECORD*)(cb - offset); 34 printf("detail中a:%d b:%c c:%d d:%d\n", pF->a, pF->b, pF->c, pF->d); 35 pF->c = 20; 36 } 37 int main() 38 { 39 tagCONTAINING_RECORD t = { 1,'a',3,4 }; 40 test(&t.b); 41 printf("main1中a:%d b:%c c:%d d:%d\n", t.a, t.b, t.c, t.d); 42 detail(&t.b); 43 printf("main2中a:%d b:%c c:%d d:%d\n", t.a, t.b, t.c, t.d); 44 getchar(); 45 return 0; 46 }