使指针类型围绕其最大值

Do pointer types wrap around their maximum value?

本文关键字:最大值 指针 类型      更新时间:2023-10-16

考虑一个不是 nullptr的指针char* p,loop

while(++p);

行为定义良好还是未定义?换句话说,当达到最大分配内存(可能是2^32或2^64)时,指针最终会变为0,或者这只是ub?

std :: numeric_limits(如预期的)不是专门用于指针类型的。

简短答案:按规格,它是未定义的行为。执行任何导致未分配内存的指针算术超过一个分配项目的地址(请参阅GCC Doc中的结尾章节的一章)是未定义的行为。


看看为什么,让我们查看标准:

sec 3.7.4.3.2在C 11中的标准标准在所有"安全衍生的指针"类型上列举。SEC 3.7.4.3.2中的大多数项目描述了合法获取对象的参考的方法。假设指针是指分配的内存,3.7.4.3.2简单地说:

仅在具有对象指针类型的情况下,指针值是安全衍生的指针,它是一个动态对象,并且是以下内容之一:

  • 使用安全衍生的指针值定义明确的指针算术(5.7)的结果;

秒5.7.4状态:

出于这些运算符的目的,指向非阵列对象的指针与指向长度为"长度"数组的第一个元素的指针相同。

最后,第5.7.5:

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

从规范的角度来看:是ub。

从A 中,什么意愿的观点,是的,它最终将在大多数环境中缠绕到零,尤其是对于普通的环境。64位系统。