已知結構體成員位址,求該結構體的位址

2021-09-29 18:47:01 字數 947 閱讀 2406

*參考 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 name of the list_struct within the struct.

*/#define list_entry(ptr, type, member) \

((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))

&((type *)0)->member:

1、把「0」強制轉化為指標型別,則該指標一定指向「0」(資料段基址)。

2、因為指標是「type *」型的,所以可取到以「0」為基位址的乙個type型變數member的位址,也就得到member相對於結構體最開始位址的長度

((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))):

1、(char *)(ptr)使得指標的加減操作步長為一位元組

2、(unsigned long)(&((type *)0)->member)等於ptr指向的member到該member所在結構體基位址的偏移位元組數

3、二者一減便得出該結構體的位址

4、強制轉換型別為(type *),得到該結構體的位址

/* 將需要操作的節點先臨時拿出來 */

list_for_each_safe(pos, node, &g_guitimertaskt.list)

}

結構體成員位址獲得結構體起始位址

經常我們在一些開源的或者核心 中會看到。define type struct ptr type member type char ptr unsigned long type 0 member 就是由結構體的成員位址獲得結構體的位址。引數 ptr 結構體的某個成員位址。type 結構體名 membe...

從結構體成員獲取結構體位址的方法

今天朋友面試,有乙個問題他沒回答上來,我便在這裡給出答案,希望能幫助到一些準備找工作的同學。因為結構體成員在記憶體中的儲存資料是按照成員定義順序儲存的,因此,要回答這個問題,首先得解決兩個問題 意識到這兩個問題,還得注意兩個細節 1 c c 語言中,對指標進行算數運算時指標跳過的記憶體是 sizeo...

C語言根據結構體成員變數的位址,得到結構體的位址

看nginx 時發現雙鏈表使用的是這種方法,記錄一下 給出乙個例項來說明 struct father t f char ptr f.b 而不是 ptr f.b 這裡ptr是b的位址,而不是它指向的位址。根據c語言對struct型別的儲存特性,我們可以畫這麼乙個圖示 通過分析圖示,我們可以看出,我們只...