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

以下宏的结果很清楚:

#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的评论。

它将NULL指针转换为不带参数并返回void ,并尝试调用此方法。

不用说,它崩溃了,所以CRASH的名字非常适合它。

它将0转换为函数指针,其中函数不带参数并返回void,然后尝试调用此函数。 它基本上取消引用空指针。

它将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(0)(); // call that function // ((void_func_ptr)0)(); // pure C equivalent cast 

如果fp是一个指向函数的指针,* fp就是函数本身,所以( fp)()是调用它的方法。 ANSI C允许将其缩写为fp(),请记住它只是一个缩写。 ——- C陷入困境。 ((void( )())0)()是((void( )())0)()的avvreviation