offsetof 巨集定義的詳解

2021-09-23 17:21:04 字數 388 閱讀 6448

#define offsetof(type,member) (size_t)&(((type*)0)->member)
在這裡我們解釋一下這個巨集定義, 0我們知道 和null 一樣的意思 但是為什莫上面的表示式可以執行, 我們知道操作乙個空指標不是會segment fault 嗎? 

這裡就要解釋一下了 這個巨集 並不是時我們想的那樣, 因為巨集是在 編譯時處理的 而指標的引用實在執行時 用的, 所以這個寫法沒問題。

(size_t)&(((type*)0)->member)  這裡要歸功與& 取位址 運算的功勞,他表示去乙個位址,所以整個表示式就是 取後邊的變數的位址,在編譯時就有花了 所以根本不會在執行時 去真是的執行。所以不會錯。

而0就表示記憶體的其實位址也即是0x00000000 位址。

Offsetof巨集詳解

c語言面試的時候可能會考,這樣的巨集定義 define offsetof type,member size t type 0 member 函式作用 計算結構體成員的偏移,有些自有 裡也會手寫這樣的 實際上這個函式是標準實現的。實際上如果我們瀏覽 ansi c 編譯器的標標頭檔案,將在 stddef...

offsetof巨集定義分析

type是結構體型別,member是結構體中的乙個元素的元素名 define offsetof type,member int type 0 member 拆分為以下三個個步驟 1 type 0 將type型別結構體變數的首位址變為0 個人理解將其跟陣列比較 不一定正確 把0位址強制型別轉換成乙個指...

核心第一巨集 offsetof詳解

offsetof是linux核心中乙個非常重要的巨集。它的主要作用就是求結構體重某個成員在結構體重的位置偏移。其實現如下 define offsetof type,member size t type 0 member type 0 member指向結構體中member成員變數。對其取位址 type...