本身這個問題非常簡單,直接用位址差值即可求得,最近在某本書上看到了乙個非常牛的方法,第一次看還將信將疑覺得不太可能,後面上機驗證發現確實可以,**如下:
1#include
<
iostream
>23
using
namespace
std;45
6struct
test7;
1314
#define
find(structtest,e) (size_t)&(((structtest*)0)->e)
1516
intmain()
17
仔細看第14行**,發現這個巨集非常奇怪,沒錯,就是用來求偏移的。我們知道巨集的本質是替換,在預編譯的時候會替換**,那麼裡面有什麼玄機了?我發現其實此法是用了欺騙編譯器的技巧來求得偏移的。取位址符『&』決定表示式不會出現訪問記憶體錯誤,因為預設0強制轉化為結構體指標型別後是不能訪問的位址,由於有位址符,所以不會實際產生訪問變數的**。而『->』最本質的就是隊0加上後面變數在結構體中的偏移,這樣 「0 + 偏移」就求得了我們要求的值。感覺此**非常巧妙,雖然不免有人說是愚弄編譯器的伎倆,但是記下無妨,仍然覺得此法的甚妙。
如何獲取結構體某成員的偏移位址
我們假設結構體定義如下所示 cpp view plain copy print?include include struct test s 思路1 非常簡單,直接用位址差值即可求得。cpp view plain copy print?intmain intargc,char argv 思路2 考慮巨...
C C 結構體成員偏移量獲取
分析 節選自muduo.以下 通過offsetof獲取sin family在sockaddr in6中的字段偏移量.static assert offsetof sockaddr in6,sin6 family 0,sin6 family offset 0 需要注意 offsetof並非c c 標準...
結構體成員變數的偏移值
1 windows平台下有offsetof巨集可以求得結構體成員變數便宜,原始碼如下 define offsetof macro ifdef cplusplus ifdef win64 define offsetof s,m size t ptrdiff t reinterpret cast s 0...