如果能夠讓(unsigned long)(&(type))
的值為0,即&(type) == 0
的時候,那麼offset
的值就是簡單的:
offset = (unsigned long)(&(type.c));
如果說&(type) == 0
,那麼type.c
就可以等價於((type_t *)0)->c
。
但是這個語句是不能單獨存在的,因為對null指標訪問成員c
是非法的。
可以通過在該語句之前加上&符號,即獲取成員c的位址就沒問題了。因此,對應的巨集如下:
#define offset(type, member) ((unsigned long)(&(((type *)0)->member)))
參考: 結構體成員變數偏移量
我們先來定義一下需求 已知結構體型別定義如下 struct node t 且結構體1byte對齊 pragma pack 1 求 結構體struct node t中成員變數c的偏移。注 這裡的偏移量指的是相對於結構體起始位置的偏移量。有三種方法 1.使用巨集offsetof 2.定義乙個結構體,用結...
C語言中結構體偏移量的計算
一 先來一段理論知識 ansi c標準允許任何值為0的常量被強制轉換成任何一種型別的指標,並且轉換結果是乙個null指標,因此 s 0 的結果就是乙個型別為s 的null指標。如果利用這個null指標來訪問s的成員當然是非法的,但 s 0 m 的意圖並非想訪問s欄位內容,而僅僅是計算當結構體例項的首...
通過巨集函式計算結構體成員偏移量
編譯器在為結構體成員分配記憶體時,由於存在記憶體對齊機制,各個成員所佔空間可能不是連續的,因而不能簡單的通過成員型別所佔的字長來推斷其它成員或結構體物件的位址。獲得結構體成員偏移量的方法可以參照部落格 現在主要以第二種方法 通過巨集函式計算結構體成員偏移量 為例,做簡單整理和介紹 注 typeof還...