什么是C表达式((void(*)(void))0)(); 意思?

use*_*878 22 c

((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,将其转换为指向函数的指针 - 期望 - 无参数 - 并且不返回任何内容,并调用它,不提供任何参数.

  • 您还可以添加: 0 是函数(不带参数并返回 void)所在的地址。 (2认同)

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热重启)

  • 固件,有引导地址通常在0(或arm或i386的0xFFFF0000),这种跳转(调用)将导致处理器热重启.如果你想了解更多信息,请寻找***跳转到重置矢量*** (2认同)

Kev*_*vin 9

这被视为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)