【问题标题】:In what machine can (* (void (*)()) 0)() be used?(* (void (*)()) 0)() 可以在什么机器上使用?
【发布时间】:2014-03-07 11:11:53
【问题描述】:

C 陷阱和陷阱 2.1 我认为 0 总是无效的地址。他怎么能把函数放在那个位置上?

【问题讨论】:

    标签: c


    【解决方案1】:

    这取决于架构。

    从书中:

    我 一次 谈过 到 某人 谁 曾是 写作 一种 C 程序 那 曾是 去 到 跑步 独立的 在 一种 小的 微处理器(在此回答)。 什么时候 这 机器 曾是 切换 在, 这 硬件 将 称呼 这 子程序 谁的 地址 曾是 存储 在 地点 0。 在 命令 到 模拟 转弯 力量 在, 我们 有 到 设计 一种 C 陈述 那 将 称呼 这 子程序 明确地。 后 一些 想法, 我们 来了 向上 和 这 以下:

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

    【讨论】:

    • 但是0总是无效的。我很困惑
    • 这不是真的,正如我所说的,它依赖于架构。例如,它在我的 C64 上有效:sta.c64.org/cbm64mem.html
    • 你的直觉是对的。允许它不是一个好主意,因为它会阻止捕获空指针取消引用。
    • 0 并不总是无效的,就像它并不总是空指针的地址组件(我的意思是它指向的位置)一样。空指针是其地址永远不等于其他地址的东西。 (就像一个函数或一个对象。标准解释得更好,但是我现在懒得找到它)。所以可能有一些系统,其中 0 是完全有效的地址,而 null 只是别的东西(它可以是任何东西)。顺便说一句,允许访问地址 0 并不一定会阻止捕获空指针取消引用。
    • 顺便说一句,跳转到重启向量通常不会模拟开机,因为外围设备不会重置为开机状态。对于现代控制器来说,更常见的是强制执行外围设备初始化的看门狗定时器重置。
    【解决方案2】:

    对于微处理器/微控制器,除非硬件禁止,否则您可以原始访问任何 RAM/闪存地址。因此在微处理器中访问地址0是完全有效的。

    【讨论】:

      【解决方案3】:

      我认为(* (void (*)()) 0) 表示它正在尝试调用位于内存中地址0x00000000 的函数(这可能是一个无效地址

      关于 stackoverflow What does this C statement mean? 的一个非常相似的问题可能会有所帮助

      【讨论】:

      • 没有调用,需要更多()
      • @CharlesBailey:- 是的,实际上 Karoly 解释了它,它的 C 与 C++ 再次发生冲突:在 C++ 中,空参数列表意味着函数不带参数;在 C 中,这只是定义的情况 - 通常,空参数列表意味着该函数采用未指定数量的非可变参数,这些参数受默认参数提升。如果我遗漏了什么,请纠正我
      • eh..我很抱歉错过了 ()...我的问题是我认为 0 无效
      猜你喜欢
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 2011-07-20
      • 2017-08-04
      • 2018-11-18
      • 2011-11-19
      • 2016-07-19
      相关资源
      最近更新 更多