【发布时间】:2019-08-20 12:07:28
【问题描述】:
我目前正在尝试避免 C 中的指针算术工作来编写模拟器。
通常,如果您将1 添加到 C 中的指针,则改为添加指向对象的大小。但是,我正在尝试使用位和字节,所以这是不希望的。
我想知道我在这个例子中是否使用了太多括号:
*(int16_t *)(((intptr_t)bc)+sp)
如果不是,那么它是否等同于这个? :
*(int16_t *)((intptr_t)bc+sp)
sp 是我的模拟器的页面对齐堆栈地址(通过mmap 获得,没有设置MAP_FIXED)。它是一个intptr_t 类型。
bc 是 int16_t * 类型的名称。它是一个指向两个int8_t 组合的指针。
【问题讨论】:
-
"你添加了指针的大小" --> 不完全。代码添加指向对象的大小。
-
bc是int16_t *类型的名称。它是一个指向两个int8_t组合的指针。 这听起来像是strict aliasing 违规。您不能安全地获取一种类型的对象并将其视为另一种类型。在这种情况下,您不能假设两个int8_t值可以作为int16_t值安全访问,即使这两个int8_t值在内存中是相邻的。 -
注意@AndrewHenle 的警告。你似乎在这里涉足危险领域。
-
成为结构中的对象并不能免除您违反严格别名的行为。如果你想绕过它,你可以使用联合来输入双关。
-
@JL2210 你应该写一个关于如何键入双关的新问题,并包含显示你如何做的代码,我们可以更详细地了解这个问题,而不是在这个问题上切线.您可以留下对这个问题的参考,提到新问题是对此的后续。
标签: c emulation pointer-arithmetic