考虑以下情况:
National Semiconductor SC/MP有指针,当你继续递增它们时,它们将从 0x0FFF 滚动到 0x0000,因为递增电路不会将进位传播到高字节的低 nybble。因此,例如,如果我想执行
while(*ptr++)
来遍历一个以 null 结尾的字符串,那么我可能会以指向数组外部的ptr
结束。关于 PDP-10 , 因为机器字比地址1 长,指针可能在包含地址的字的上半部分有标记和其他数据。在这种情况下,如果递增指针导致溢出,则其他数据可能会被更改。在 ROM 是 32 位干净之前,非常早期的 Macintosh 也是如此。
所以我的问题是关于 C 标准是否说明了递增指针的真正含义。据我所知,C 标准假定它应该以与递增整数相同的方式按位工作。但正如我们所见,这并不总是成立。
符合标准的 C 编译器能否发出一个简单的 adda a0, 1
2 来递增指针,而不检查是否存在进位传播不会导致怪异吗?
1:在 PDP-10 上,地址是 18 位宽,而机器字是 36 位宽。一个机器字可能包含两个指针(对于 Lisp 来说很方便)或一个指针,加上位域,这意味着“添加另一层间接寻址”、段、偏移量等。或者一个机器字当然可能不包含指针,但事实并非如此与这个问题相关。
2:地址加一。那是 68000 个汇编程序。
最佳答案
只有当结果指向一个有效对象或刚刚超过一个有效对象时,C 标准才指定指针算法的行为。不仅如此,该标准并没有说明指针的位是什么样的;实现可以安排它们以适合自己的目的。
所以,不,标准没有说明当指针递增到地址翻转时会发生什么。
如果while
你引用的循环只处理数组末尾的一个元素,它在 C 中是安全的。(根据标准,如果 ptr
已递增到数组末尾之外的一个元素,并且 x
指向任何数组中的元素,包括第一个元素,则 x < ptr
必须为真。因此,如果 ptr
已在内部翻转,C 实现负责确保比较仍然有效。)
如果您的 while
循环可能会增加 ptr
超出数组末尾的元素超过一个,C 标准未定义该行为。
关于c - C标准是否指定递增指针时进位传播的距离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51848935/