通过结构体某个成员的地址计算结构体首地址 (转)
最近在CU論壇上有很多人在問這樣一個問題:給出一個結(jié)構(gòu)體成員的地址計算該結(jié)構(gòu)體的起始地址。其實這個題我之前也沒有接觸過,據(jù)說內(nèi)核代碼中有這樣用的,但還沒有看到。不過覺得這個題的解決方法還是有一定技巧的,就總結(jié)一下。下面是實現(xiàn)的代碼。
?
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define STRUCT_OFFSET(stru_name, element) (unsigned long)&((struct stru_name*)0)->element 4 struct stru_addr 5 { 6 int a; 7 char b; 8 int d; 9 char c; 10 11 }; 12 13 int main() 14 { 15 struct stru_addr s; 16 unsigned long offset = 0; 17 printf("start addr of s = %x\n", &s.a); 18 19 offset = STRUCT_OFFSET(stru_addr, c); 20 21 printf("c_addr = %x, offset = %u\n", &s.c, offset); 22 printf("start addr of s caculated from c addr: %x\n", (char *)&s.c - offset); 23 system("pause"); 24 return 0; 25 }?
?
?
其實整個程序中最關(guān)鍵的部分就是如何求出結(jié)構(gòu)體中某個成員相對于結(jié)構(gòu)體首地址的偏移量。這里的解決方法是:假設(shè)存在一個虛擬地址0,將該地址強制轉(zhuǎn)換成為該結(jié)構(gòu)體指針類型(struct stru_name*)0。那么地址0開始到sizeof(struct)-1長度的內(nèi)存區(qū)域就可以視為一個結(jié)構(gòu)體的內(nèi)存。這樣結(jié)構(gòu)體中任何一個元素都可以通過對該結(jié)構(gòu)體指針解引用得到。由于該結(jié)構(gòu)體的起始地址為0, 因此任何一個成員的地址應(yīng)該等于其相對于結(jié)構(gòu)體起始地址的偏移,這也就是計算偏移量的方法:(unsigned long)&((struct?stru_name*)0)->element。
上面程序執(zhí)行的結(jié)果如下:
上述的結(jié)果中還同時考慮了結(jié)構(gòu)體內(nèi)的對齊問題。
原文地址:http://blog.chinaunix.net/uid-10167808-id-25940.html
轉(zhuǎn)載于:https://www.cnblogs.com/challenge1230/p/4383012.html
總結(jié)
以上是生活随笔為你收集整理的通过结构体某个成员的地址计算结构体首地址 (转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Register-SPWorkflowS
- 下一篇: 四则运算升级版