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

时间:2015-05-06 23:30:25

标签: c++ c pointers

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

while(++p);

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

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

2 个答案:

答案 0 :(得分:9)

简短回答:根据规范,这是未定义的行为。执行任何指针运算导致未分配的内存超过分配项目的多个地址(请参阅GCC文档中的One Past the End章节,了解其重要性)是未定义的行为。

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

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

  

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

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

Sec 5.7.4规定:

  

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

最后,第5.7.5节:

  

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

答案 1 :(得分:2)

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

what-it-it-do 的角度来看,是的,它最终将在大多数环境中回归到零,特别是对于普通的C.它可能需要一个世纪左右的时间。 64位系统。