簡體   English   中英

宏((void(*)())0)()是什么意思?

[英]What does the macro ((void(*)())0)() mean?

以下宏的結果很清楚:

#define CRASH() do {\
  *(int *)(uintptr_t)0xbbadbeef = 0;\
  ((void(*)())0)();\
} while (false)

我的問題是,這條線是什么

((void(*)())0)();

用英語分解? 例如,“這是一個返回指針的函數....”

看起來它將0轉換為函數指針(帶有不帶參數的簽名並具有void返回類型),然后調用它。

(     (            void(*)()                  ) 0       )      ();
  /* cast..*/ /* fn pointer signature */  /*..cast 0 */  /* invocation */

這是另一種說法,它試圖調用(調用)一個預期位於地址0x00000000的內存中的函數 - 這被保證是一個無效的地址。

  • 0到一個指針指向一個void函數, 可以在沒有參數(被稱為(void(*)())0的表達式的一部分)
  • 通過帶有空參數列表的指針()后面的()部分調用該函數)。

編輯1 :編輯回應Cristoph的評論。

它將0轉換為函數指針,其中函數不帶參數並返回void,然后嘗試調用此函數。 它基本上取消引用空指針。

它將NULL指針轉換為不帶參數並返回void ,並嘗試調用此方法。

不用說,它崩潰了,所以CRASH的名字非常適合它。

它將0轉換為指向函數的指針,然后嘗試調用該函數。 這將導致段錯誤和崩潰。

編輯:對這些問題的競爭太多了。 全面響起,我要去睡覺了:)

它意味着“將NULL指針視為指向void function()指針,調用function() ”。

它取值為零,並將其強制轉換為不返回任何內容的函數指針(void)。

據推測,目的是當你調用這個“函數”時,它會調用地址為零,這應該會使應用程序崩潰。

對我來說,翻譯成不同的C ++更簡單,而不是直接翻譯成英文:

typedef void (void_func_t)();       // type of a function taking no arguments 
                                    // and returning void
typedef void_fnct_t* void_func_ptr; // pointer to such a function
static_cast<void_func_ptr>(0)();    // call that function
// ((void_func_ptr)0)();            // pure C equivalent cast

如果fp是一個指向函數的指針,* fp就是函數本身,所以( fp)()是調用它的方法。 ANSI C允許將其縮寫為fp(),請記住它只是一個縮寫。 ------- C陷入困境。 ((無效()())0)()是的avvreviation((無效()())0)()

暫無
暫無

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

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