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

Ngu*_*Dat 6 c syntax function-pointers

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

(*(void(*)())0)();
Run Code Online (Sandbox Code Playgroud)

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

我试图编译它,并感到惊讶,它没有导致错误.

Ste*_*sop 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
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上,代码将具有特定于您正在编译它的平台的行为.某些平台可能会明确定义,而其他平台则可能是非法的.我最近买了一个微控制器,当它被激活时,它会从内存中的地址0开始执行代码.所以代码会跳到程序的开头. (2认同)
  • 是的,那个微控制器是其中一个案例,这意味着它只有*可能*崩溃 - nguyendat使用的平台不会低的概率;-)当我说"未定义的行为"当然我的意思是,一如既往,未经C标准定义.特定实现可以保证在特定的未定义行为的情况下它们将做什么. (2认同)

Bri*_*ndy 6

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

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

void test() { }

void(*pfn)() = test;
(*pfn)();
Run Code Online (Sandbox Code Playgroud)