list entry函式分析

2021-09-07 20:11:12 字數 736 閱讀 8416

#define list_entry(ptr, type, member) \

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

目的:目的: // 根據節點ptr的位址,得到其type結構體的首位址, member是type結構體中的節點變數名

根據節點ptr, 找到ptr所在的type結構指標

ptr:     list_t節點指標, 

type:     要查詢的指標型別

member: member是type結構體中定義的list_t型別變數名

分析:(char *) (ptr)就是鍊錶中的乙個節點:&(t.member)

(unsigned long)&((type *) 0)->member): 是member成員到type結構首位址之間的距離

二者相減 = type變數的首位址

使用例子:

static list_head (head);    

typedef struct t type

int main();

ptr = head->next;    // =&(t.member) 鍊錶中的乙個節點

struct t *p = list_entry(ptr, struct t, member) // = &t

分析list entry()巨集

分析list entry 巨集 define list entry ptr,type,member type char ptr unsigned long type 0 member ptr是指向list head型別鍊錶的指標,type為乙個結構,而member為結構type中的乙個域,型別為li...

OSTaskCreate()函式分析

int8u ostaskcreate void task void pd void p arg,os stk ptos,int8u prio 函式返回乙個8位的整型數,呼叫該函式需要四個引數。第乙個引數乙個指標,也就是使用者 的首位址,在平時使用中我們把自己建立的任務的名字作為這個引數就可以了 第三...

getopt函式分析

函式getopt主要用於拆分命令列引數,用這個函式就不自己寫命令列引數解析程式了,以下 摘自tcpdump原始碼,對這個函式比較感興趣,故對此進行分析注釋,因水平實在不敢恭維,不足之處希望能一起 函式getopt 有三個引數,nargc,nargv就是命令列傳過來的argc和argv字串ostr,它...