((void(*)(void))0)();
所以我们将整数0类型转换为这个棘手的类型(void(*))(void),然后执行它.消息来源声称这应该有效,但它实际上是什么?
#define TRUE FALSE我认为这必须是那些C类笑话之一.
小智 27
这是一个期望没有参数并且不返回任何值的函数:
void f(void)
Run Code Online (Sandbox Code Playgroud)
这是一个指向函数的指针,该函数期望没有参数并且不返回任何值:
void (*p)(void)
Run Code Online (Sandbox Code Playgroud)
这是该指针的类型:
void (*)(void) /* just remove the p! */
Run Code Online (Sandbox Code Playgroud)
这是括号中的类型:
(void (*)(void))
Run Code Online (Sandbox Code Playgroud)
这是对该类型的强制转换(括号中的类型,后跟一个值):
(void (*)(void))0
Run Code Online (Sandbox Code Playgroud)
还在我这儿?到目前为止,我们有一个整数值0强制转换为指向函数的指针 - 不带参数 - 并且不返回任何内容.
强制转换是一个带指针到函数类型的表达式.如果您有其中一个,可以这样称呼它:
(your expression here)(arguments to the function)
Run Code Online (Sandbox Code Playgroud)
第一组括号仅用于优先级,有时可能不需要(但这次是它们).最终结果:
((void (*)(void))0)(/* no args */);
Run Code Online (Sandbox Code Playgroud)
取值0,将其转换为指向函数的指针 - 期望 - 无参数 - 并且不返回任何内容,并调用它,不提供任何参数.
Jek*_*yll 14
将地址强制转换为函数指针然后调用它的语法如下所示:
((void (*)(void))address)();
Run Code Online (Sandbox Code Playgroud)
这样做可能更清楚:
void (*fptr)(void) = (void (*)(void))address;
fptr();
Run Code Online (Sandbox Code Playgroud)
说该((void(*)(void))0)(); 指令通常用于在固件中跳转到0.它有点不合适,因为它实际上调用0而不是跳到0,但实际上它不会有任何区别(将执行fw热重启)
这被视为NULL一个函数指针并执行它,它应该在大多数系统上引发一个sigbus或类似的东西.
void(*)(void) <- type, function pointer taking no arguments and returning no value
(void(*)(void)) <- cast to above type
((...)0) <- cast NULL/0 to said type
((...)0)() <- execute the cast value as a function
Run Code Online (Sandbox Code Playgroud)