为什么我们在这里将 0 添加到双空指针?
Why are we adding 0 to a double void pointer here?
就上下文而言,这是从应该引导到主应用程序的引导加载程序调用的代码。此代码段来自一个带有参数 uintptr_t address
的函数,该参数指定写入主应用程序的地址。我相信 sp
和 pc
分别是堆栈指针和程序计数器。
代码如下:
sp = *((void **)address + 0);
pc = *((void **)address + 1);
start_new_application(sp, pc);
完整上下文 here
然后我去打印地址、sp 和 pc,发现以下内容:
address -> 0x08010000
sp ------> 0x20050000
pc ------> 0x080132DD
这让我很困惑。我不确定为什么 sp
行中有一个 + 0
。 sp
行是否可以重写为:
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];
Could that sp
line be rewritten as:
sp = (void *)address;
不,这会使 sp
等于 address
,这不是原始代码的作用。原始代码从指向的地址中提取了一个 void*
:*address
.
就上下文而言,这是从应该引导到主应用程序的引导加载程序调用的代码。此代码段来自一个带有参数 uintptr_t address
的函数,该参数指定写入主应用程序的地址。我相信 sp
和 pc
分别是堆栈指针和程序计数器。
代码如下:
sp = *((void **)address + 0);
pc = *((void **)address + 1);
start_new_application(sp, pc);
完整上下文 here
然后我去打印地址、sp 和 pc,发现以下内容:
address -> 0x08010000
sp ------> 0x20050000
pc ------> 0x080132DD
这让我很困惑。我不确定为什么 sp
行中有一个 + 0
。 sp
行是否可以重写为:
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];
Could that
sp
line be rewritten as:
sp = (void *)address;
不,这会使 sp
等于 address
,这不是原始代码的作用。原始代码从指向的地址中提取了一个 void*
:*address
.