Я просматривал веб-страницу , на которой были некоторые c часто задаваемые вопросы, я нашел это заявление сделанным.
Аналогично, если a имеет 10 элементов и ip
указывает на [3], , который вы не можете вычислить или
доступ по ip + 10 или ip - 5. (есть
один особый случай: вы можете, в этом
случай, вычислить, но не доступ,
указатель на несуществующий элемент
сразу за концом массива,
в данном случае это & a [10].
Я был смущен заявлением
Вы не можете вычислить IP + 10
Я могу понять, что доступ к элементу за пределами не определен, но вычисление !!!
Я написал следующий фрагмент, который вычисляет (дайте мне знать, если это то, что веб-сайт имел в виду , вычисляя ) указатель вне пределов.
#include <stdio.h>
int main()
{
int a[10], i;
int *p;
for (i = 0; i<10; i++)
a[i] = i;
p = &a[3];
printf("p = %p and p+10 = %p\n", p, p+10);
return 0;
}
$ ./a.out
p = 0xbfa53bbc and p+10 = 0xbfa53be4
Мы можем видеть, что p + 10 указывает на 10 элементов (40 байт) после p. Так что же конкретно означает заявление, сделанное на веб-странице? Я что-то неправильно истолковал.
Даже в K & R (A.7.7) это утверждение сделано:
Результатом оператора + является
сумма операндов. Указатель на
объект в массиве и значение любого
интегральный тип может быть добавлен. ...
сумма указатель того же типа, что и
оригинальный указатель и указывает на
другой объект в том же массиве,
соответственно смещение от оригинала
объект. Таким образом, если P является указателем на
объект в массиве, выражение P + 1
указатель на следующий объект в
массив. Если указатель суммы указывает
за пределами массива,
кроме как в первом месте за
высокий конец, результат
не определено.
Что значит быть «неопределенным». Означает ли это, что сумма будет неопределенной, или это означает, что только когда мы разыменовываем ее, поведение не определено. Является ли операция неопределенной, даже если мы не разыменовываем ее и просто вычисляем указатель на элемент вне границ.