【问题标题】:Storing an address into a function pointer将地址存储到函数指针中
【发布时间】:2017-12-19 05:56:43
【问题描述】:

我在看this video关于使用软件调用引导加载程序,方法是将系统内存的开始地址分配给一个函数指针,然后调用它,存储地址的表达式:

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

“sysMemBootJump”是函数指针。

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

【问题讨论】:

    标签: c pointers function-pointers


    【解决方案1】:

    因为“真正的”入口点存储在该地址。把它想象成一个指向函数的指针,通过取消引用你得到的只是指向函数的指针。

    【讨论】:

      【解决方案2】:

      这相当于:

      u32 ad = *(u32*)0x1fff0004;
      

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

      然后

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

      所以0x1fff0004 是包含例程地址的字的地址。

      请注意,代码非常不可移植。一个更便携的整数类型可转换到/从地址是uintptr_t from <stdint.h> ....

      您可以通过typedef 函数签名,如here,编写更具可读性的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-25
        • 1970-01-01
        • 2021-07-18
        • 1970-01-01
        • 2021-06-03
        • 1970-01-01
        相关资源
        最近更新 更多