他们说这个表达式在C中有效,这意味着调用一个函数:
(*(void(*)())0)();
有人可以清楚地解释这个表达的含义吗?
我试图编译它,并且感到惊讶的是它没有导致错误。
答案 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)
在嵌入式环境中,可能是一种调用系统重置例程的方法。