我目前正在尝试避免 C 中的指针算术工作来编写模拟器。
通常,如果您添加1
对于 C 中的指针,您可以添加所指向对象的大小。但是,我正在尝试使用位和字节,因此这是不希望的。
我想知道在这个例子中我是否使用了太多括号:
*(int16_t *)(((intptr_t)bc)+sp)
如果不是,那么它相当于这个吗? :
*(int16_t *)((intptr_t)bc+sp)
sp
是我的模拟器的页面对齐堆栈地址(通过获取)mmap
没有MAP_FIXED
放)。它是一个intptr_t
type.
bc
是一个名字int16_t *
类型。它是一个指向两个组合的指针int8_t
's.
(((intptr_t)bc)+sp)
相当于((intptr_t)bc+sp)
.
但整个“避免指针算术”方法是不可移植的。
至少有 3 个担忧:
作为整数的差异可能是 16,而不是希望的 2——即使 2 的差异更为常见。
进一步地,与*(int16_t *)((intptr_t)bc+sp)
, if sp
是奇数,(int16_t *)
由于对齐限制可能会失败。
抗锯齿问题也会发生。@安德鲁·亨利 https://stackoverflow.com/questions/55419302/casting-behavior-in-c/55419552#comment97557988_55419302
虽然整数避免指针运算有各种陷阱 - 祝你好运。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)