((void(*)(void))0)();
我们将整数0强制转换为了一个棘手的类型(void(*))(void)
,然后执行它。来源声称这应该是有效的,但实际上它做了什么呢?
我想这一定是像#define TRUE FALSE
那样的C语言笑话吧。
((void(*)(void))0)();
我们将整数0强制转换为了一个棘手的类型(void(*))(void)
,然后执行它。来源声称这应该是有效的,但实际上它做了什么呢?
我想这一定是像#define TRUE FALSE
那样的C语言笑话吧。
void f(void)
void (*p)(void)
这是那个指针的类型:
void (*)(void) /* just remove the p! */
这是括号中的类型:
(void (*)(void))
这是将值转换为括号中指定的类型的语法(括号中是类型,后面跟着一个值):
(void (*)(void))0
还跟上我了吗?到目前为止,我们将整数值0转换为一个指向不带参数且返回值为空的函数指针。
这个转换是一个具有函数指针类型的表达式。当你拥有其中之一时,可以像这样调用它:
(your expression here)(arguments to the function)
第一组括号仅用于优先级,有时可能不需要(但这次需要)。最终结果:
((void (*)(void))0)(/* no args */);
将地址强制转换为函数指针并调用它的语法如下:
((void (*)(void))address)();
但可能更清晰的做法是这样:
void (*fptr)(void) = (void (*)(void))address;
fptr();
据说((void(*)(void))0)();
指令通常用于跳转到固件中的地址0。虽然它实际上是调用了地址0而不是跳转,但在实际应用中并没有区别(设备将会执行热重启)。这将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
abort()
,也许? ;) - Guidoif(cmd == RESET) // 如果命令是RESET
((void (*)(void))address)(); // 来自黑魔法的某些东西
- user2984878