[英]Difficulty in understanding the offsetof MACRO
我一直在搜索冗長而艱辛的鏈接(末尾的鏈接),以了解offsetof MACRO的實現:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
特別是,對NULL進行解引用以獲得該成員在結構中的偏移量。 許多文章通過說NULL指針實際上從未真正被取消引用來掩蓋其原因,但這對我來說沒有意義。
以下是我嘗試理解的一些鏈接:
我正在尋找並試圖理解的是對編譯器如何解釋MACRO定義的逐步了解,這將最終解釋NULL指針實際上並未被取消引用。
編輯:即使其他問題回答了我的問題,正如原始帖子中指出的那樣,它們對我也沒有意義。 @dasblinkenlight的答案闡明了我在回答其他問題時遇到的確切問題,即我們實際上沒有取消引用指針的方式。
特別是,對NULL進行解引用以獲得該成員在結構中的偏移量。
不會取消對正在進行的指針的引用 ,因為操作符&
->
撤消了操作符->
的作用:
NULL
的取消引用: ((TYPE *)0)->MEMBER
&
使其成為地址計算: &((TYPE *)0)->MEMBER
許多文章通過說NULL指針實際上從未真正被取消引用來掩蓋其原因,但這對我來說沒有意義。
考慮以下示例:
int a;
int *p = &a;
int b = *p; // <<== This is a dereference
int *q = &(*p); // <<== This is not a dereference
*
和&
這兩個運算符相互抵消。 運算符->
是*
和之上的“語法糖” .
,因此&
也可以撤消其影響。
當編譯器看到表達式somePointer->a
它將獲取指針somePointer
的數值,添加成員a
的偏移量,並了解可在其上進行操作的內存位置。 您可以對內存中的位置執行以下三項操作:
項目1和2(閱讀和寫作)構成取消引用。 但是,第3項沒有取消引用,因為沒有訪問特定地址的內存。
宏實質上要求編譯器假設基本地址為零,以計算成員a
地址。 地址a
回自然會等於a
的偏移。 您需要做的就是獲取其地址,這就是您與運營商&
做的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.