为什么我们在这里将 0 添加到双空指针上?

Why are we adding 0 to a double void pointer here?

本文关键字:空指针 添加 我们 在这里 为什么      更新时间:2023-10-16

对于上下文,这是从引导加载程序调用的代码,应该引导到主应用程序中。此代码段来自一个带有参数uintptr_t address的函数,该参数指定主应用程序的写入位置的地址。我相信sppc分别是堆栈指针和程序计数器。

代码如下:

sp = *((void **)address + 0);
pc = *((void **)address + 1);
start_new_application(sp, pc);

完整的背景在这里

然后我打印了地址,sp和pc,并找到了以下内容:

address -> 0x08010000
sp ------> 0x20050000
pc ------> 0x080132DD

这让我非常困惑。我不确定为什么sp行有+ 0sp行是否可以改写为:

sp = (void *)address;

做同样的事情?

我的理解是,地址已被static_casted到双空指针中,然后sp被赋予地址(0x08010000(的取消引用值,pc被赋予地址(0x08010001(的取消引用值。然后,在我的 printf 语句中,显示的这些值是这些地址的取消引用值。

我的理解在这里正确吗?

+ 0

只是为了可读性。

sp = *((void **)address + 0);
pc = *((void **)address + 1);

执行相同的操作

sp = *((void **)address);
pc = *((void **)address + 1);

或使用C++强制转换和下标运算符:

sp = reinterpret_cast<void**>(address)[0];
pc = reinterpret_cast<void**>(address)[1];

sp行是否可以改写为:

sp = (void *)address;

不,这将使sp等于address,这不是原始代码所做的。原始代码从指向的地址中提取void**address