一年後再次回頭看container of巨集的作用

2021-09-22 23:54:44 字數 1008 閱讀 5370

container_of巨集在很久以前的文章我就已經有分析寫過了,但是看回去,感覺以前自己對這個巨集的表達描述分析能力還是有待提高,畢竟那時候剛接觸linux核心不久,整個人都懵懵噠,無法說得讓別人通俗易懂。

那麼這個巨集整體是什麼樣子的呢?

//獲取結構體成員相對於結構體的偏移 

#define offsetof(type,member) ((int) &((type *)0)->member)

//通過獲取結構體中的某個成員,反推該結構體的指標

#define container_of(ptr, type , member) ()

作用:通過某個結構體中的某個成員變數的指標,反推這個結構體變數的指標。說白了,我定義乙個結構體變數和結構體指標,變數.結構體中某乙個成員(這個我是知道的),還有知道它的位址,也就是&(變數.結構體中某乙個成員),通過這兩個引數,還有結構體的type,返回得到的就是結構體的首位址。

工作原理:

先用typeof獲取變數的資料型別,也就是member成員的型別,然後將member這個成員 的指標轉成自己型別的指標,再從offsetof相減,就得到整個結構體變數的首位址了,再將該位址強制轉化為type *。

關於offsetof的作用就不再闡述,文章超連結在這:offsetof巨集的作用和原理

接下來看看如何使用吧,也很簡單。

#include #include //獲取結構體成員相對於結構體的偏移 

#define offsetof(type,member) ((int) &((type *)0)->member)

//通過獲取結構體中的某個成員的,反推該結構體的指標

#define container_of(ptr, type , member) ()

#pragma pack(4)

struct ptr

; #pragma pack()

int main(void)

一年後重新來

一年半後,又回到了csdn,現在早以不作c 又從新開始了c 生涯.半年的使用,麻煩還是不少,尤其是記憶體管理.以前使c 麻煩在理解api,現在麻煩在語言本身的指標這塊.到現在了還一把指標,記憶體問題.剛請教了別人乙個弱弱的問題,特把結果記在這裡,以示警戒.這事我的問題 這是我自己編寫了乙個異常類 c...

一年後的目標

其次,是生活中的反省。之前能8點半到公司,每天寫一點今日的收穫,做一下筆記,為什麼現在就沒有動力起床了呢?今天看到馬雲說公司不為員工準備班車,是覺得熱愛工作的員工是不會因為這個而遲到,還是能堅持早起的,之前坐在大神erik旁邊,雖然沒有問過他什麼技術問題,但是有一點對我觸動很深,就是他每天8點多就去...

寫給一年後的我

最近,看著 師兄們找工作也慢慢到了尾聲,大部分都找到了自己心儀的工作。不禁想到,一年後的現在,我是不是也找到了屬於自己的那份工作呢?作為一名電子類的大學的研究生,大學本科四年學到的僅僅是教科書上的東西,也沒有得到其他方面的培訓和學習。研究生一年級,上學期在學院的研究生科當了半年的助管,平時也是在上課...