#define offsetof(type,member) (size_t)&(((type*)0)->member)
在這裏我們解釋一下這個宏定義, 0我們知道 和NULL 一樣的意思 但是爲什莫上面的表達式可以運行, 我們知道操作一個空指針不是會segment fault 嗎?
這裏就要解釋一下了 這個宏 並不是時我們想的那樣, 因爲宏是在 編譯時處理的 而指針的引用實在運行時 用的, 所以這個寫法沒問題。
(size_t)&(((type*)0)->member) 這裏要歸功與& 取地址 運算的功勞,他表示去一個地址,所以整個表達式就是 取後邊的變量的地址,在編譯時就有花了 所以根本不會在運行時 去真是的運行。所以不會錯。
而0就表示內存的其實地址也即是0x00000000 地址。