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)的结果李>
从规范的角度来看:它是UB
从它将做什么的角度来看,是的,在大多数环境中,它最终将环绕到零,特别是对于纯C。对于64位系统,它可能需要一个世纪左右的时间。好的
无符号int
不会溢出,它环绕模极大值_size@EyasSH:指针既不是有符号的,也不是无符号的,标准中没有依据说它们更像无符号整数而不是有符号整数。@EyasSH:这是未定义的行为——但唯一相关的边界是指针指向的数组对象的边界。(为了指针运算的目的,单个对象被视为一个单元素数组。)您可能会删除“Additional”一词之前的所有内容。“after unallocated memory”的意义是什么?这是“分配内存后”的拼写错误,还是您试图描述其他内容?@Barry:5.7.4对于解释这种行为并非数组独有是非常必要的。包括3.7.4.3.2是一个较弱的论点。