vc_CONTAINING_RECORD使用

 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 }
相關文章
相關標籤/搜索