“& a + 1>& a”会导致未定义的行为

时间:2013-04-30 13:26:47

标签: c++ c c99 c++03

c99/c++03是否保证&a+1 > &a始终为真?

例如,有一个(类c)std::copy

int a = 0 ;
int b[9] ;
std__copy(&a , &a+1 , b) ;

这总是有效吗?

2 个答案:

答案 0 :(得分:17)

是的,C99有一个特殊的措辞,说在处理地址时,任何给定的对象a将像一个1项的数组,因此&a+1是有效的(§6.5.6/ 7 ):

  

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

虽然章节编号不同(§6.3.6),但C90给出了相同的要求。

C ++在§5.7/ 4中有相同的要求(C ++ 03和C ++ 11中的段号相同)。

在C ++中,您可以使用std::less比较任意对象(相同类型)的地址,即使内置<运算符不会产生有意义的结果(例如,两个不是同一数组的部分)(§20.8.5/ 7):

  

对于模板greaterlessgreater_equalless_equal,任何指针类型的特化都会产生总顺序,即使内置运算符&lt; ,&gt;,&lt; =,&gt; =不要。

另请注意,虽然您可以形成这些地址,并且可以将它们与对象的地址进行比较,但无法取消引用这些指针(好吧,如果您尝试,编译器可能不会阻止您,但结果将是未定义的行为)。

答案 1 :(得分:3)

是的,这在C ++中是有保证的(不知道C)。具体是T类型的变量等同于同一类型的单个元素的数组,并且总是可以获得超出数组末尾的指针。