1#define offsetof(type, member) ((size_t) & ((type *)0)->member )
巨集功能:獲得乙個結構體變數成員在此結構體中的偏移量。
1. ( (type *)0 ) 將零轉型為type型別指標;
2. ((type *)0)->member 訪問結構中的資料成員;
3. &( ( (type *)0 )->member )取出資料成員的位址,即相對於0的偏移量,要的就這個;
4.(size_t)(&(((type*)0)->member))結果轉換型別,size_t應該最終為unsigned int型別。
此巨集的巧妙之處在於將 0 轉換成(type*),這樣結構體中成員的位址即為在此結構體中的偏移量。
示例:
#include#define offsetof(type, member) ((int)(&((type *)0)->member))
struct _test_
;int main(void)
執行後結構為:temp = 8。
顯然求出了 結構體成員變數 z 在結構體中的偏移量為 8。
#define container_of(ptr, type, member) ()
巨集功能:從結構體(type)某成員變數(member)指標(ptr)來求出該結構體(type)的首指標。
#include#define offsetof(type, member) ((int)(&((type *)0)->member))
#define container_of(ptr, type, member) ()
struct _test_
;void assignment(struct _test_ *t)
void getheadpoint(int *tz)
int main(void)
執行結果為:
line31 = 2
line43 tmp - >x = 1
大概解釋一下:先定義乙個結構體並給其賦值,現在 getheadpoint函式只傳入這個結構體的乙個子成員變數位址。在 getheadpoint函式中通過container_of巨集來獲得此結構體的首指標,通過此首指標即可以獲得此結構體的其它子成員的值。
1、.typeof( ( (type *)0)->member )為取出member成員的變數型別。
2、定義__mptr指標ptr為指向該成員變數的指標
3、mptr為member資料型別的常量指標,其指向ptr所指向的變數處
4、.(char *)__mptr轉換為位元組型指標。(char *)__mptr - offsetof(type,member))用來求出結構體起始位址(為char *型指標),然後(type *)( (char *)__mptr -offsetof(type,member) )在(type *)作用下進行將位元組型的結構體起始指標轉換為type *型的結構體起始指標。
5、.()這個擴充套件返回程式塊中最後乙個表示式的值。
C語言使用巨集來控制結構體裡的成員定義
這裡只是記錄下c語言裡使用巨集來控制結構體裡成員定義。在閱讀linux核心原始碼時,會發現很多結構體裡都有各種巨集開關,來控制是否定義某個成員變數。下面自己寫個簡單的程式驗證下,include define switch struct teststruct int main void printf ...
C語言基礎六(結構體以及一些巨集定義)
結構體宣告時,成員大小必須確定,因此不能有未定義大小的資料型別作為成員,同樣也不能用函式作為結構體成員。但是,每個系統指標型別的大小是確定的,所以可以以結構體指標或者函式指標作為結構體成員。結構體位元組對齊 結構體變數本身從4位元組對齊的位置開始存放。整個結構體所佔空間還要是成員中 佔位元組最大的基...
有關結構體的一些題目
1 設有下面的結構體和結構變數定義 struct student 關於結構體型別變數賦值正確的是 a studl.id 1001 studl.name tom b id 1001 studl.name tom c studl.id 1001 studl.name tom d studl.id 100...