2013-05-14 6 views
5

§6.5.8\6 (о>, <, < =,> =)странно формулировка в стандарте, в отношении сравнения указателей

Если выражение P указывает на элемент объекта массива и выражения Q точек к последнему элементу того же объекта массива, выражение указателя Q + 1 сравнивается больше, чем P. Во всех остальных случаях поведение не определено.

Несколько разделов выше, §6.5.8, поясняется, что в основном, арифметика указателя работает, как и ожидалось, на массивах. То есть int a[3]; int *p = a; int *q = &a[2]; //q-p == 3 действительно. Однако, как я читал выше, q > p является UB.

Что мне не хватает?

+6

Вам не хватает предложения перед предыдущим: «указатели на элементы массива с большими значениями индекса больше, чем указатели на элементы того же массива с нижним индексом».Вы цитируете исключение, чтобы разрешить полуоткрытые диапазоны, такие как ['a',' a + 3'). – dyp

+0

@ DyP, О, ну. Я должен был прочитать еще пять раз, чтобы понять это. Другой глупый вопрос формирует мою сторону :( – Vorac

+1

Это стандарт, некоторые утверждают, что это стандарт для сложной и неинтуитивной формулировки;) – dyp

ответ

1

Во-первых, вы процитировали часть параграфа, первая часть объясняет, что это ссылки, я включил этот пункт здесь:

Когда два указателя сравниваются, результат зависит от относительного расположения в адресное пространство объектов, на которые указывает. Если два указателя на типы объектов указывают на тот же объект или оба указывают один за последним элементом одного и того же объекта массива, они сравниваются с . Если объекты, на которые указывают, являются членами одного и того же совокупного объекта, указатели для объявленных позже элементов структуры сравниваются больше, чем указатели на члены , объявленные ранее в структуре, и указатели на элементы массива с большим индексом значения сравниваются больше, чем указатели на элементы тот же массив с более низкими значениями индекса. Все указатели на члены одного и того же объекта объединения сравниваются одинаково. Если выражение P указывает на элемент объекта массива, а выражение Q указывает на последний элемент одного и того же объекта массива, выражение указателя Q + 1 сравнивается больше P. Во всех остальных случаях поведение не определено.

В принципе, немного вы ссылка ссылается на то, что обычно указатель должен всегда точка либо в одиночку стенд объект к элементу массива объектов или один мимо конца массива объектов. Как вы можете видеть, обычно приращение указателя, который уже указывает на последний элемент массива, приведет к недопустимому указателю, и действительно, этот указатель в стандарте никогда не должен быть разыменован, однако его можно использовать для одного частного случая, могут быть установлены или сопоставлены с другим указателем.

Это полезно в программе, в которой вы увеличиваете указатель, а затем проверяете, прошел ли он мимо конца массива и прекратите работу, если это произойдет. Например.

int foo = 0; 
int ArrSize = 6; 
int bar[ArrSize]; 
while(foo < ArrSize) 
{ 
    foo++; 
    printf("%d", bar + 3 < bar + foo); 
} 

Будет законным, даже в последнем случае, когда foo указывает на один за концом массива.

Примечание: этот пример очень надуман, но демонстрирует точку.

Если не для этого правила, эта программа будет неопределенным поведением.

+0

Последняя итерация вызывает неопределенное поведение в вашем примере кода. 'bar + 7' вызывает UB под секцией о том, что означает' + 'для указателя плюс целое число. –

+0

@MattMcNabb Арг, вы правы, я использовал неправильного оператора, имел смысл использовать <. Я буквально смешал эти два раза сотни раз, я бы подумал после почти 15 лет C, я бы избежал этой глупой ошибки. Тем не менее, спасибо за комментарий, я думаю, что он исправлен. – Vality

+1

@MattMcNabb Я действительно понял, что для Q + 2 нет ошибки, я сделал ошибку и всегда делаю так, что длина массива! = Индекс последнего элемента. Я всегда рассчитываю от 1, а не от нуля :( – Vality

 Смежные вопросы

  • Нет связанных вопросов^_^