簡體   English   中英

難以理解MACRO的偏移量

[英]Difficulty in understanding the offsetof MACRO

我一直在搜索冗長而艱辛的鏈接(末尾的鏈接),以了解offsetof MACRO的實現:

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

特別是,對NULL進行解引用以獲得該成員在結構中的偏移量。 許多文章通過說NULL指針實際上從未真正被取消引用來掩蓋其原因,但這對我來說沒有意義。

以下是我嘗試理解的一些鏈接:

  1. http://www.viva64.com/en/b/0301/
  2. http://www.embedded.com/design/prototyping-and-development/4024941/Learn-a-new-trick-with-the-offsetof--宏
  3. http://www.geeksforgeeks.org/the-offsetof-macro/
  4. C offsetof宏如何工作?
  5. 取消引用NULL指針是否可以確保C / C ++中的程序崩潰?

我正在尋找並試圖理解的是對編譯器如何解釋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. 了解地址

項目1和2(閱讀和寫作)構成取消引用。 但是,第3項沒有取消引用,因為沒有訪問特定地址的內存。

宏實質上要求編譯器假設基本地址為零,以計算成員a地址。 地址a回自然會等於a的偏移。 您需要做的就是獲取其地址,這就是您與運營商&做的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM