c - C标准是否指定递增指针时进位传播的距离?

标签 c pointers language-lawyer

考虑以下情况:

  • 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/

相关文章:

c - Linux 上是否有等效的 C 函数 mbsinvalid?

c++ - 通过 C++ 中的非静态函数设置对 C 函数指针的回调

c - 获取错误 : memory protection violation

c - 用 C 语言编写一个程序,应用 Luhn 算法进行信用卡验证

c - 需要帮助理解 c 中指针和数组的代码

c++ - 是否允许 std::string 的 end+1 迭代器?

c++ - 将前向声明的类型转换为 void 是否合法?

c++ - 为什么返回类型推导不能支持带有 std::is_invocable_v 的 SFINAE

c - 在uint8_t指针中添加int到底有什么作用?

c - 访问结构体中包含的数组