代码之家  ›  专栏  ›  技术社区  ›  moha

将地址存储到函数指针中

  •  0
  • moha  · 技术社区  · 7 年前

    我在看 this video 关于使用软件调用引导加载器,方法是将系统内存开头的地址分配到函数指针中,然后调用用于存储地址的表达式:

    sysMemBootJump = (void(*)(void))(*(u32*)0x1fff0004);
    

    “sysMemBootJump”是函数指针。

    但我不明白的是,为什么他在将内存强制转换为void(*)(void)之前取消了对内存地址的引用?

    2 回复  |  直到 7 年前
        1
  •  3
  •   SoronelHaetir    7 年前

    因为“真实”入口点存储在该地址。可以将其视为指向函数指针的指针,通过取消引用,只会得到指向函数的指针。

        2
  •  2
  •   Basile Starynkevitch    7 年前

    这相当于:

    u32 ad = *(u32*)0x1fff0004;
    

    这是 正在获取 位于地址的单词 0x1fff0004

    然后

    sysMemBootJump = (void(*)(void))ad;
    

    所以 0x1FF0004 是包含例程地址的单词的地址。

    注意代码是 非常 不可移植。一种更便携的可转换到/来自地址的积分类型是 uintptr_t 从…起 <stdint.h> ....

    你可以 typedef 函数签名,如 here ,以编写更可读的代码。