[英]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.