【问题标题】: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,编写更具可读性的代码。