【问题标题】:What does C expression ((void(*)(void))0)(); mean?C 表达式 ((void(*)(void))0)(); 是什么意思?意思是?
【发布时间】:2013-12-03 16:56:01
【问题描述】:

((void(*)(void))0)();

所以我们将整数 0 类型转换为这个棘手的类型(void(*))(void),然后执行它。消息来源声称这应该有效,但它实际上是什么?

我想这一定是像 #define TRUE FALSE 这样的 C 笑话之一。

【问题讨论】:

  • 哪个消息来源声称这应该有效?你有链接吗?在上下文中可能更容易理解。
  • 它正在转换为函数指针。看起来像一个等待发生在我身上的段错误。
  • 非标准abort(),也许吧? ;)
  • Jekyll 的回答让我不禁要问你,你的问题是否是在嵌入式系统的背景下出现的?
  • 这是在一个笑话的上下文中提到的:if(cmd == RESET) // if command is RESET((void (*)(void))address)(); // something from black magic

标签: c


【解决方案1】:

这是一个没有参数并且没有返回值的函数:

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 */);

取值 0,将其转换为指向函数的指针,期望无参数和返回无,然后调用它,不提供任何参数。

【讨论】:

【解决方案2】:

将地址转换为函数指针然后调用它的语法 看起来像这样:

((void (*)(void))address)();

不过,这样做可能更清楚:

void (*fptr)(void) = (void (*)(void))address;
fptr();

((void(*)(void))0)();指令在固件中通常用于跳转到0。这有点不合适,因为它实际上是调用 0 而不是跳转到 0,但实际上它不会有任何区别(将执行 fw 热重启)

【讨论】:

  • 请问“fw”是什么意思?
  • 固件,有引导地址通常在0(arm或i386为0xFFFF0000),这个跳转(调用)会导致处理器热重启。如果您想了解更多信息,请查看 跳转到重置向量
  • @ShafikYaghmour 我会寻找它,同时您可以在learn.adafruit.com/system/assets/assets/000/010/293/original/… 看到 Arduino 中的一个小变体请注意,此重置不太适合大型控制器(如 ARM11 或更新版本)通常它会触发一个内部看门狗,以实现更“安全”的硬件重置。
【解决方案3】:

这将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

【讨论】:

    【解决方案4】:

    在某些嵌入式系统(例如 AVR 微控制器)上,这可能是实现对复位向量的跳转(实际上是调用)的一种方式。

    您可以通过这种方式重新启动软件,尤其是如果您在此之前禁用了中断。

    【讨论】:

      【解决方案5】:

      AVR 通常会在地址 0 加载用户应用程序。在更高地址加载的引导加载程序可能会跳转到地址 0(调用函数)。因此,强制转换并调用地址 0在这种环境中是一个有用的结构。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-01
        • 2019-12-08
        • 2012-03-11
        • 2011-11-19
        • 1970-01-01
        • 2013-03-09
        • 1970-01-01
        相关资源
        最近更新 更多