解密(*(void(*)())0)()

时间:2010-04-09 00:47:47

标签: c syntax function-pointers

他们说这个表达式在C中有效,这意味着调用一个函数:

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

有人可以清楚地解释这个表达的含义吗?

我试图编译它,并且感到惊讶的是它没有导致错误。

5 个答案:

答案 0 :(得分:18)

一步一步:

   void(*)()        // a pointer-to-function type, taking unspecified parameters
                    // and returning nothing.
  (void(*)())0      // a null pointer of that pointer-to-function type
(*(void(*)())0)     // dereference that pointer
(*(void(*)())0)();  // and call it with no parameters

代码具有未定义的行为,它可能会因某种非法访问/段错误而崩溃。

答案 1 :(得分:6)

您正在创建指向函数的指针,然后调用它。我不会称之为隐藏的功能,而是未定义的行为。

基本上你这样做但是地址为0:

void test() { }

void(*pfn)() = test;
(*pfn)();

答案 2 :(得分:3)

它是指向NULL处的函数的指针。

void(*)()是指向函数的指针的定义,该函数不带任何不返回任何内容的args;你可以说出来:

typedef void(*my_func)();

然后在你的例子中你有一个演员:

(my_func)0产生一个指向my_func的函数指针,即一个不带任何东西并且什么都不返回的函数。

然后用前导星号(这是不必要的,afaik)取消引用它,然后你调用它。

因此,您正在调用一个不带参数的函数,并且不会返回任何碰巧生活在零地址的函数。

这是(通常)未定义的行为,并且会在许多平台上立即崩溃。 (如果你把一个函数放在零地址,这不是未定义的行为,至少我不认为它是。)

答案 3 :(得分:2)

按括号分解。

最后一个()表示没有参数的函数。

(void(*)())表示返回void的函数。

最后一点,开头的(*0)告诉编译器要调用的函数的地址位于指针位置0。

所以基本上,你在没有参数的情况下调用地址0处的任何东西。通常不太安全。 :)

答案 4 :(得分:0)

在嵌入式环境中,可能是一种调用系统重置例程的方法。