通过结构体某个成员的地址计算结构体首地址 (转)
生活随笔
收集整理的這篇文章主要介紹了
通过结构体某个成员的地址计算结构体首地址 (转)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近在CU論壇上有很多人在問這樣一個問題:給出一個結構體成員的地址計算該結構體的起始地址。其實這個題我之前也沒有接觸過,據說內核代碼中有這樣用的,但還沒有看到。不過覺得這個題的解決方法還是有一定技巧的,就總結一下。下面是實現的代碼。
?
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 }?
?
?
其實整個程序中最關鍵的部分就是如何求出結構體中某個成員相對于結構體首地址的偏移量。這里的解決方法是:假設存在一個虛擬地址0,將該地址強制轉換成為該結構體指針類型(struct stru_name*)0。那么地址0開始到sizeof(struct)-1長度的內存區域就可以視為一個結構體的內存。這樣結構體中任何一個元素都可以通過對該結構體指針解引用得到。由于該結構體的起始地址為0, 因此任何一個成員的地址應該等于其相對于結構體起始地址的偏移,這也就是計算偏移量的方法:(unsigned long)&((struct?stru_name*)0)->element。
上面程序執行的結果如下:
上述的結果中還同時考慮了結構體內的對齊問題。
原文地址:http://blog.chinaunix.net/uid-10167808-id-25940.html
轉載于:https://www.cnblogs.com/challenge1230/p/4383012.html
總結
以上是生活随笔為你收集整理的通过结构体某个成员的地址计算结构体首地址 (转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Register-SPWorkflowS
- 下一篇: 四则运算升级版