經常我們在一些開源的或者核心**中會看到。
#define
type_struct
(ptr
,type
,member)((
type
*)((
char
*)(ptr
)-(unsigned
long
)(&((
type *)0
)->
member
)))
就是由結構體的成員位址獲得結構體的位址。
引數:ptr
:結構體的某個成員位址。
type
:結構體名
member
:該成員名
這個就是很巧妙地利用了已知結構體的位址情況下用
struct_ptr -> member
利用"->"求成員的位址,其實就是
結構體首位址
+偏移量
來求得成員位址。
於是我們把0位址強制轉換成該結構體的位址,再用"->"來求偏移量:
(
unsigned
long
)(&((
type *)0
)->
member
))
那麼反過來用成員位址 「回退」 這個偏移量就得到了結構體 變數的首位址了。
((
type
*)((
char
*)(ptr
)-(unsigned
long
)(&((
type *)0
)->
member
)))
那麼整個過程其實就是
結構體首位址
=成員位址
-該成員在該結構體裡的偏移量
注意:注意其中的
((
type
*)((
char
*)(ptr
)
它是首強制轉換成了 char* 。
其實道理大家都懂,就是強制轉換了在進行指標的 加 減 執行 就是按 「位元組」來的。
指標 null
已知結構體成員位址,求該結構體的位址
參考 list entry 的方法 list entry get the struct for this entry ptr the struct list head pointer.type the type of the struct this is embedded in.member the...
從結構體成員獲取結構體位址的方法
今天朋友面試,有乙個問題他沒回答上來,我便在這裡給出答案,希望能幫助到一些準備找工作的同學。因為結構體成員在記憶體中的儲存資料是按照成員定義順序儲存的,因此,要回答這個問題,首先得解決兩個問題 意識到這兩個問題,還得注意兩個細節 1 c c 語言中,對指標進行算數運算時指標跳過的記憶體是 sizeo...
C語言根據結構體成員變數的位址,得到結構體的位址
看nginx 時發現雙鏈表使用的是這種方法,記錄一下 給出乙個例項來說明 struct father t f char ptr f.b 而不是 ptr f.b 這裡ptr是b的位址,而不是它指向的位址。根據c語言對struct型別的儲存特性,我們可以畫這麼乙個圖示 通過分析圖示,我們可以看出,我們只...