以下宏的结果很清楚:
#define CRASH() do {\
*(int *)(uintptr_t)0xbbadbeef = 0;\
((void(*)())0)();\
} while (false)
我的问题是,该行是什么
((void(*)())0)();
用英语分解?例如,“这是一个返回指向....的函数”
答案 0 :(得分:14)
看起来它将0
转换为函数指针(带有不带参数的签名并具有void返回类型),然后调用它。
( ( void(*)() ) 0 ) ();
/* cast..*/ /* fn pointer signature */ /*..cast 0 */ /* invocation */
另一种方式是说它试图调用(调用)一个预期位于地址0x00000000的内存中的函数 - 这保证是一个无效的地址。
答案 1 :(得分:3)
0
投射到指向void
函数的指针,可以不带参数调用(表达式的(void(*)())0
部分)()
部分)调用该函数。编辑1 :编辑以回应Cristoph的评论。
答案 2 :(得分:2)
它将0转换为函数指针,其中函数不带参数并返回void,然后尝试调用此函数。它基本上取消引用空指针。
答案 3 :(得分:2)
它会向不带参数的方法转换NULL
指针,并返回void
,并尝试调用此方法。
毋庸置疑,它会崩溃,因此名称CRASH
非常适合。
答案 4 :(得分:0)
它将0转换为指向函数的指针,然后尝试调用该函数。这将导致段错误和崩溃。
编辑:对这些问题的竞争太多了。全面响起,我要睡觉了:)
答案 5 :(得分:0)
这意味着“将NULL指针视为void function()
的指针,调用function()
”。
答案 6 :(得分:0)
它取值为零,并将其强制转换为不返回任何内容的函数指针(void)。
据推测,目的是当你调用这个“函数”时,它会调用地址为零,这应该会使应用程序崩溃。
答案 7 :(得分:0)
对我来说,翻译成不同的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
答案 8 :(得分:0)
如果fp是指向函数的指针,* fp是函数本身,所以( fp)()是调用它的方法。 ANSI C允许将其缩写为fp(),请记住它只是一个缩写。 ------- C陷入困境。 ((void()())0)()是((void()())0)()
的avvreviation