Будет & amp; а + 1 & gt; & Усилителя, A & Quot; вызвать неопределенное поведение

Есть ли c99/c++03 гарантировать, что &a+1 > &a всегда верно?

например, есть (c-like) std::copy, а также

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

Это всегда работает?

17

Решение

Да, C99 имеет специальную формулировку, чтобы сказать, что при работе с адресами, любой данный объект a будет действовать как массив из 1 элемента, так что &a+1 действителен (§6.5.6 / 7):

Для целей этих операторов указатель на объект, который не является элементом
массив ведет себя так же, как указатель на первый элемент массива длиной один с
Тип объекта как тип его элемента.

Хотя номер раздела отличается (§6.3.6), C90 предъявляет те же требования.

C ++ имеет те же требования в §5.7 / 4 (один и тот же номер раздела в C ++ 03 и C ++ 11).

В C ++ вы можете сравнивать адреса произвольных объектов (того же типа), используя std::less, даже когда встроенный < оператор не даст значимых результатов (например, два объекта, которые не являются частями одного и того же массива) (§20.8.5 / 7):

Для шаблонов greater, less, greater_equal, а также less_equal, специализации для любого типа указателя дают общий порядок, даже если встроенные операторы <>, <=,> = нет.

Также обратите внимание, что хотя вы можете сформировать эти адреса и сравнить их с адресом объекта, вы не могу разыменуйте эти указатели (хорошо, компилятор, вероятно, не остановит вас, если вы попытаетесь, но результатом будет неопределенное поведение).

17

Другие решения

Да, это гарантировано в C ++ (не знаю о C). Специфика в том, что переменная типа T эквивалентна массиву из одного элемента того же типа, и вы всегда можете получить указатель за концом массива.

3