看nginx代碼時發現雙鏈表使用的是這種方法,記錄一下
給出一個實例來說明
struct father_t { int a; char *b; double c; }f; char *ptr = &(f.b); //而不是 ptr = f.b; 這里ptr是b的地址,而不是它指向的地址。 |
根據C語言對struct類型的存儲特性,我們可以畫這么一個圖示:
通過分析圖示,我們可以看出,我們只需要把當前知道的成員變量的地址ptr,減去它在結構體當中相對偏移4就的到了結構體的地址(ptr-4)。
有兩種方法可以獲得成員地址偏移量
1.方法一,包含頭文件#include <stddef.h>,調用函數offsetof(struct s, i)來實現。
2、方法二,使用&(((s1*)0)->i)的形式。