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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

最近在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é)果如下:

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

上述的結(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。