亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言之offset_of宏和container_of宏

發布時間:2020-07-03 04:11:39 來源:網絡 閱讀:544 作者:菜鳥養成記 欄目:編程語言

  通過結構體整體變量來訪問其中各個元素,本質上是通過指針方式來訪問的,形式上是通過.的方式來訪問的(這時候其實是編譯器幫我們自動計算了偏移量)。

1:offset_of宏

作用:計算結構體中某個元素和結構體首地址的偏移量(其實質是通過編譯器來幫我們計算)。

定義:

#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)

參數分析:TYPE是結構體類型,MEMBER是結構體中一個元素的元素名

返回值:member元素相對于整個結構體變量的首地址的偏移量,類型是int

原理:通過虛擬一個type類型結構體變量,然后用type.member的方式來訪問那個member元素,繼而得到member相對于整個變量首地址的偏移量。

(TYPE *)0 這是一個強制類型轉換,把0地址強制類型轉換成一個指針,這個指針指向一個TYPE類型的結構體變量。 (實際上這個結構體變量可能不存在,但是只要我不去解引用這個指針就不會出錯)。

((TYPE *)0)->MEMBER (TYPE *)0是一個TYPE類型結構體變量的指針,通過指針來訪問這個結構體變量的member元素

&((TYPE *)0)->MEMBER  等效于&(((TYPE *)0)->MEMBER),意義就是得到member元素的地址。但是因為整個結構體變量的首地址是0,所以member元素的地址就是member元素相對于整個結構體的偏移量


2:container_of宏:

container_of宏是linux內核中常用的一個宏,用于從結構體元素中獲取這個結構體本質的指針,也就是通過結構體變量中的某個成員變量來獲取整個結構體的首地址

container_of宏定義如下

#define container_of(ptr, type, member) ({      \  
   const typeof( ((type *)0)->member ) *__mptr = (ptr);    \  
   (type *)( (char *)__mptr - offsetof(type,member) );})  

分析:

  (1)作用:知道一個結構體中某個元素的指針,反推這個結構體變量的指針。有 了container_of宏,我們可以從一個元素的指針得到整個結構體變量的指針,繼而得到結構體中其他元素的指針。

  (2)typeof關鍵字的作用是:typepof(a)時由變量a得到a的類型,typeof就是由變量名得到變量數據類型的。

  (3)這個宏的工作原理:先用typeof得到member元素的類型定義成一個指針,然后用這個指針減去該元素相對于整個結構體變量的偏移量(偏移量用offsetof宏得到的),減去之后得到的就是整個結構體變量的首地址了,再把這個地址強制類型轉換為type *即可。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沂水县| 巨野县| 汝阳县| 温宿县| 莱州市| 镇平县| 邢台市| SHOW| 齐河县| 盱眙县| 磴口县| 甘肃省| 扎赉特旗| 五家渠市| 富顺县| 林芝县| 东山县| 肃南| 陵水| 紫金县| 喀喇| 宕昌县| 建始县| 运城市| 贵德县| 洛南县| 镇雄县| 彭阳县| 娄底市| 句容市| 新巴尔虎右旗| 莆田市| 曲沃县| 桃园县| 酒泉市| 遵义县| 巢湖市| 乌审旗| 伊宁县| 从江县| 阜宁县|