指针类型是否包围其最大值?

vso*_*tco 10 c c++ pointers

考虑一个char* p不是的指针nullptr和循环

while(++p);
Run Code Online (Sandbox Code Playgroud)

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

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

Eya*_*sSH 10

简短的回答:根据规范,它是未定义的行为.执行任何指针运算导致未分配的内存超过一个已分配项目的地址(请参阅GCC文档中的一个过去结束章节,了解其重要性)是未定义的行为.


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

C++ 11标准中的Sec 3.7.4.3.2枚举了所有"安全派生指针"类型.标准的第3.7.4.3.2节中的大多数项描述了合法获取对象引用的方法.假设指针指的是已分配的内存,3.7.4.3.2只是说明:

指针值是指向动态对象的安全派生指针,只有它具有对象指针类型且它是以下之一:

  • 使用安全派生的指针值定义良好的指针算法(5.7)的结果;

第5.7.4节规定:

出于这些运算符的目的,指向非阵列对象的指针与指向长度为1的数组的第一个元素的指针的行为相同,其中对象的类型为其元素类型.

最后,第5.7.5节:

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

  • 好吧`unsigned int`不会溢出,它包围modulo max_size (2认同)