linux中鏈表函數問題

來源:互聯網
上載者:User

  

25[ 標籤:linux,鏈表函數 ]在學習核心鏈表時,有下列函數希望比較懂的人來回答以下這些函數及結構體的作用struct list_head *ptr,這個定義定義的是什嗎?是鏈表頭指標ptr嗎?那接上面的一句是INIT_LIST_HEAD(ptr)這句是什麼意思?初始化以ptr為頭指標的鏈表嗎?另外list_for_each(*p1,*p2)(傳入的是兩個指向list_head結構體的指標),那這兩個指標參數的區別是什嗎?還有list_entry(p,exp,list),這個函數傳回值是名為exp的一個鏈表節點的地址嗎?為什麼不能直接用&exp?年華似水
回答:1 人氣:1 解決時間:2011-07-30 14:55 滿意答案

好評率:100%

我來回答吧 不過有點複雜 我盡量解釋清楚 一個問題一個問題來吧!1,ptr指標是鏈表的頭指標,2,INIT_LIST_HEAD(ptr) 是一個宏,具體的實現參見list.h 是將ptr裡的 prev和next兩個指標指向自己,這樣就完成了初始化。3,list_for_each(*p1,*p2) 從名字上來看就知道是遍曆一個鏈表,p1是迴圈遍曆過程中使用的迴圈變數而p2是遍曆鏈表使用的開始點和結束點。4,第四個問題是最關鍵也是最難以理解的問題了。首先,我們要明白在核心中為了最大可能的通用性,核心中設計的鏈表和我們平常使用的鏈表的最大區別是核心中的鏈表除了prev和next之外不包含任何資料,所以在使用鏈表的時候,我們將struct list_head 嵌入到具體使用的帶鏈表的資料結構中,像進程表等,核心中很多結構體都使用這種方式。例如,struct temp { int a,struct list_head list} tmp;這個時候通過鏈表頭ptr,我們可以遍曆到一個鏈表的任何一個位置,但是,我們只知道結構體tmp中list的位置,那麼如何操作這個鏈表中的資料呢,這個時候就要通過list_for_entry來獲得包含list對應的tmp結構的地址。在這個例子中將list的地址減掉int a所佔的空間,就能得到tmp的地址。為此專門設計了一個宏,list_entry(p,exp,list)來進行這個計算。其實list_entry等價於container_of(ptr,type, member)這個宏,宏的實現是const typeof( ((type *)0)->member ) *__mptr = (ptr);\(type *)( (char *)__mptr-offsetof(type,member) );}),下面解釋一下這個實現,首先解釋一下 offsetof這個宏,它的實現是#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER),意思是TYPE是個struct類型,而MEMBER是這個struct中的一個成員. 因為這個struct的基地址為0, 所以MEMBER的地址就是這個成員相對於struct頭地址的位移量。回到container_of的實現上來,首先聲明一個和member是相同類型的指標常量*__mptr,並初始化為ptr,再將這個值強轉成char*類型再減去ptr這個指標所指向的成員在整個struct的位移量,這樣就得到了這個struct的入口地址。所以list_entry這個宏返回的是p這個鏈表指標對應的鏈表節點的結構體的入口地址。至於為什麼不能用&exp,你的問題裡沒有上下文無法判斷。比較複雜,希望你能看懂
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.