#ifndef offsetof
#define offsetof(type, member) ((size_t)&((type*)0)->member)
#endif
offset這個巨集有兩個引數 type 和 member ,這個巨集求的是結構 type 中 member 成員的偏移量。
先理解最裡面的部分:
((type*)0)->member
&((type*)0)->member
這裡對((type*)0)->member進行取址操作,首位址0加上member的偏移量。如果我們把(type*)0的位址用x替代,member的相對於結構體物件首位址的偏移量為x的話,這裡得到的值就是x + y。因為(type*)0的值為0,所以這裡得到的值就是member的偏移量y。
看下面乙個具體的例子:
//filename: main.c
#include typedef struct _stst;
void func(st* pst)
int main()
執行結果:
pst: 0060fea4
pi: 0060fea4
pj: 0060fea8
pc: 0060feac
這個結果顯而易見,如果傳入的是0位址呢。
即func(null);或func((st*)0);執行結果:
pst: 00000000
pi: 00000000
pj: 00000004
pc: 00000008
這裡可以看出,對下面這幾行**:
int *pi = &(pst->i);
int *pj = &(pst->j);
char* pc = &(pst->c);
對於外面有&這個取址操作,這裡->符號並沒有去讀取記憶體位址中的資料,只是進行了乙個指標偏移量運算。
回到最開始offsetof這個巨集:
int a = offsetof(st, c);
printf("a: %d\n", a);
執行結果:
a:8
關於offsetof巨集
offsetof 巨集 這是在看書的時候遇到的,估計以後會用到,避免遺忘,先記下來吧。一般形式 define offsetof type,member size t type 0 member 說明 通過 type 0 將0位址強制轉換為type結構型別中的指標 通過 type 0 member 訪...
實現巨集offsetof
offsetof 型別,成員 返回成員偏移量 具有函式形式的此巨集返回資料結構或聯合型別型別中成員成員的偏移值 以位元組為單位 返回的值是size t型別的無符號整數值,以及指定成員與其結構開頭之間的位元組數。定義乙個結構體指標s a 未初始化的這個指標是乙個野指標 並沒有指向有效合法的記憶體空間 ...
Offsetof巨集詳解
c語言面試的時候可能會考,這樣的巨集定義 define offsetof type,member size t type 0 member 函式作用 計算結構體成員的偏移,有些自有 裡也會手寫這樣的 實際上這個函式是標準實現的。實際上如果我們瀏覽 ansi c 編譯器的標標頭檔案,將在 stddef...