offsetof巨集定義分析

2021-08-13 10:46:12 字數 568 閱讀 1637

//type是結構體型別, member是結構體中的乙個元素的元素名

#define offsetof(type, member) ((int) &((type *)0)->member)

拆分為以下三個個步驟:

1、(type *)0(將type型別結構體變數的首位址變為0)

個人理解將其跟陣列比較(不一定正確),把0位址強制型別轉換成乙個指標,這個指標指向乙個type型別的結構體變數(將0位址與type型別繫結),(type *)0是乙個type型別結構體變數的指標。

2、(type *)0)->member

指標指向type型別的結構體變數

3、&((type *)0)->member)

取位址,取出member元素的位址

綜上可知,因為type型別結構體變數首位址為0,所以得到的member元素的位址就是menber元素的偏移量

例如:struct mystrut

根據上述分析及結構體對齊原理可畫出下圖:

offsetof 巨集定義的詳解

define offsetof type,member size t type 0 member 在這裡我們解釋一下這個巨集定義,0我們知道 和null 一樣的意思 但是為什莫上面的表示式可以執行,我們知道操作乙個空指標不是會segment fault 嗎?這裡就要解釋一下了 這個巨集 並不是時我們...

關於offsetof巨集

offsetof 巨集 這是在看書的時候遇到的,估計以後會用到,避免遺忘,先記下來吧。一般形式 define offsetof type,member size t type 0 member 說明 通過 type 0 將0位址強制轉換為type結構型別中的指標 通過 type 0 member 訪...

實現巨集offsetof

offsetof 型別,成員 返回成員偏移量 具有函式形式的此巨集返回資料結構或聯合型別型別中成員成員的偏移值 以位元組為單位 返回的值是size t型別的無符號整數值,以及指定成員與其結構開頭之間的位元組數。定義乙個結構體指標s a 未初始化的這個指標是乙個野指標 並沒有指向有效合法的記憶體空間 ...