第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

了解Linux內(nèi)核中的container_of宏

了解Linux內(nèi)核中的container_of宏

長風(fēng)秋雁 2019-11-26 12:50:53
當(dāng)我瀏覽Linux內(nèi)核時,我發(fā)現(xiàn)了一個container_of定義如下的宏:#define container_of(ptr, type, member) ({                      \        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \        (type *)( (char *)__mptr - offsetof(type,member) );})我了解container_of的作用,但我不明白的是最后一句話,即(type *)( (char *)__mptr - offsetof(type,member) );})如果我們按如下方式使用宏:container_of(dev, struct wifi_device, dev);最后一句話的相應(yīng)部分是:(struct wifi_device *)( (char *)__mptr - offset(struct wifi_device, dev);看起來什么也沒做。有人可以在這里填補空白嗎?
查看完整描述

3 回答

?
繁星點點滴滴

TA貢獻1803條經(jīng)驗 獲得超3個贊

最后一句話:


(type *)(...)

指向給定的指針type。指針計算為相對于給定指針的偏移量dev:


( (char *)__mptr - offsetof(type,member) )

使用cointainer_of宏時,您想要檢索包含給定字段的指針的結(jié)構(gòu)。例如:


struct numbers {

    int one;

    int two;

    int three;

} n;


int *ptr = &n.two;

struct numbers *n_ptr;

n_ptr = container_of(ptr, struct numbers, two);

您有一個指向結(jié)構(gòu)中間的指針(并且您知道這是指向已歸檔的two[ 結(jié)構(gòu)中的字段名稱 ] 的指針),但是您想檢索整個結(jié)構(gòu)(numbers)。因此,您可以計算two結(jié)構(gòu)中字段的偏移量:


offsetof(type,member)

并從給定的指針中減去此偏移量。結(jié)果是指向結(jié)構(gòu)開始的指針。最后,將此指針轉(zhuǎn)換為結(jié)構(gòu)類型以具有有效變量。


查看完整回答
反對 回復(fù) 2019-11-26
  • 3 回答
  • 0 關(guān)注
  • 666 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號