C++ 指针类型是否环绕其最大值?

C++ 指针类型是否环绕其最大值?,c++,c,pointers,C++,C,Pointers,考虑一个不是nullptr的指针char*p,以及循环 while(++p); 行为定义是否明确?换句话说,当达到最大可分配内存(可能是2^32或2^64)时,指针最终是否会变为0,或者这只是UB (如预期)不是指针类型专用的。简短回答:根据规范,它是未定义的行为。执行任何导致未分配内存超过已分配项一个以上地址的指针算法(有关其意义,请参阅GCC文档中的章节)都是未定义的行为 要了解原因,让我们看看标准: C++11标准第3.7.4.3.2节列举了所有“安全派生指针”类型。本标准第3.7.4

考虑一个不是
nullptr
的指针
char*p
,以及循环

while(++p);
行为定义是否明确?换句话说,当达到最大可分配内存(可能是2^32或2^64)时,指针最终是否会变为0,或者这只是UB


(如预期)不是指针类型专用的。

简短回答:根据规范,它是未定义的行为。执行任何导致未分配内存超过已分配项一个以上地址的指针算法(有关其意义,请参阅GCC文档中的章节)都是未定义的行为


要了解原因,让我们看看标准:

C++11标准第3.7.4.3.2节列举了所有“安全派生指针”类型。本标准第3.7.4.3.2节中的大多数条款描述了合法获取对象参考的方法。假设指针指向已分配的内存,3.7.4.3.2仅说明:

指针值是指向动态对象的安全派生指针,仅当其具有对象指针类型且为以下类型之一时:

  • 使用安全导出的指针值定义良好的指针算法(5.7)的结果
第5.7.4节规定:

对于这些运算符,指向非数组对象的指针的行为与指向长度为1的数组的第一个元素的指针的行为相同,该数组的元素类型为对象的类型

最后,第5.7.5节:

如果指针操作数和结果都指向同一数组对象的元素,或超过数组对象最后一个元素的元素,则计算不应产生溢出否则,行为未定义。


从规范的角度来看:它是UB


从它将做什么的角度来看,是的,在大多数环境中,它最终将环绕到零,特别是对于纯C。对于64位系统,它可能需要一个世纪左右的时间。

好的
无符号int
不会溢出,它环绕模极大值_size@EyasSH:指针既不是有符号的,也不是无符号的,标准中没有依据说它们更像无符号整数而不是有符号整数。@EyasSH:这是未定义的行为——但唯一相关的边界是指针指向的数组对象的边界。(为了指针运算的目的,单个对象被视为一个单元素数组。)您可能会删除“Additional”一词之前的所有内容。“after unallocated memory”的意义是什么?这是“分配内存后”的拼写错误,还是您试图描述其他内容?@Barry:5.7.4对于解释这种行为并非数组独有是非常必要的。包括3.7.4.3.2是一个较弱的论点。