为什么我们在这里将 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);
完整的背景在这里
然后我打印了地址,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];
sp
行是否可以改写为:
sp = (void *)address;
不,这将使sp
等于address
,这不是原始代码所做的。原始代码从指向的地址中提取void*
:*address
。
相关文章:
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 运行时错误:引用绑定到类型为"int"的空指针
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 为什么我在空指针错误(链表)中获取成员访问权限
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 成员访问是否在空指针上定义C++?
- 尝试将对象插入空指针数组时出现分段错误
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 是否允许向空指针添加零?
- 为什么 C 样式字符串的工作空指针检查不?
- 在函数内初始化无符号字符指针将返回空指针
- 为什么多维数组中的空字符串文本衰减为空指针?
- C++ 取消引用指向矢量的空指针时的分段错误
- 错误 C6011:取消引用空指针"NAME"。C++
- cppcheck取消引用空指针
- 打印空指针时,std::cout 可以打印 "NULL" 而不是 0 吗?
- 递增空指针无法正确设置值
- Qt - 将空指针(原始数据)转换为 QImage 并将其显示在标签上
- 为什么我们在这里将 0 添加到双空指针上?