擷取結構體中的欄位位移量或結構體地址

來源:互聯網
上載者:User

擷取一個結構體中的某欄位的位移量,linux的核心代碼中是這樣定義實現的:
offset = (unsigned long)(&((type*)0))->member); 其中type就是結構體類型,member即某欄位名。

這裡簡單的說明一下這句代碼的意思,本來(type*)0就是一個null 指標,使用null 指標引用成員肯定會造成段錯誤,但是重點就是前門的
&這個符號,&符號表示我們只是取那個欄位的地址,而不是要去引用這個欄位的內容,所以不會造成段錯誤。

另外結構體中的欄位在記憶體中分配的地址是連續的,當我們去讀取某個欄位時,就比如&((type*)0)->member,會先取結構體類型
type的地址,然後再計算member欄位的位移量(offset),再將type的地址加上member欄位的位移量,得到member欄位真正的地
址,而這個動作是編譯器幫我們完成的。

那麼利用這個特性,我們就有辦法得到member的位移量。比如&ptr->member取member的地址,所以如果ptr的地址是100的話,那
麼member的地址就是100+offset。那如果ptr是0的話,這樣得到的結果就是offset,也就是member在type結構體中的位移量。

最後而且利用這個特性,當知道member的地址時,我們也很容易得到結構體的地址值,即p = (type*)((char*)(ptr)-(unsigned long)(&((type*)0)->member))。




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.