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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

结构体成员地址获得结构体起始地址

發布時間:2025/4/9 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 结构体成员地址获得结构体起始地址 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

經常我們在一些開源的或者內核代碼中會看到。

  • #define TYPE_STRUCT(ptr, type, member)((type *)((char*)(ptr)-(unsigned long)(&((type *)0)->member)))
  • 就是由結構體的成員地址獲得結構體的地址。 參數:
  • ptr :結構體的某個成員地址。
  • type:結構體名
  • member:該成員名
  • 這個就是很巧妙地利用了已知結構體的地址情況下用
  • struct_ptr -> member
  • 利用"->"求成員的地址,其實就是
  • 結構體首地址+偏移量
  • 來求得成員地址。 于是我們把0地址強制轉換成該結構體的地址,再用"->"來求偏移量:
  • (unsigned long)(&((type *)0)->member))
  • 那么反過來用成員地址 “回退” 這個偏移量就得到了結構體 變量的首地址了。
  • ((type *)((char*)(ptr)-(unsigned long)(&((type *)0)->member)))
  • 那么整個過程其實就是
  • 結構體首地址=成員地址-該成員在該結構體里的偏移量

  • 注意: 注意其中的
  • ((type *)((char*)(ptr)
  • 它是首強制轉換成了 char* 。 其實道理大家都懂,就是強制轉換了在進行指針的 加 減 運行 就是按 “字節”來的。 指針?http://www.cnblogs.com/yml435/p/4655463.html



    null



    轉載于:https://www.cnblogs.com/yml435/p/6644776.html

    總結

    以上是生活随笔為你收集整理的结构体成员地址获得结构体起始地址的全部內容,希望文章能夠幫你解決所遇到的問題。

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