日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

通过结构体某个成员的地址计算结构体首地址 (转)

發布時間:2025/3/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过结构体某个成员的地址计算结构体首地址 (转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在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。

上面程序執行的結果如下:

1 [root@localhost tmp]# ./a.out 2 start addr of s = bf81b820 3 c_addr = bf81b82c, offset = 12 4 start addr of s caculated from c addr: bf81b820

上述的結果中還同時考慮了結構體內的對齊問題。

原文地址:http://blog.chinaunix.net/uid-10167808-id-25940.html

轉載于:https://www.cnblogs.com/challenge1230/p/4383012.html

總結

以上是生活随笔為你收集整理的通过结构体某个成员的地址计算结构体首地址 (转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。