Чтобы подробнее рассказать о существующих ответах, я хотел бы добавить объяснение.
В вашем коде i
является переменной int
. Вы назначаете адрес i
на номер pointer
. Хорошо. Затем, что вы делаете, увеличивайте указатель (адрес), а затем пытайтесь разыменовать его.
Теперь, по сравнению с утверждением в вашем коде,
printf("%i\n", *(pointer + 1));
со ссылкой на стандарт C11
, глава §6.5.6, Аддитивные операторы
[....] Если оба указателя и результат указывают на элементы одного и того же объекта массива или один последний элемент объекта массива, оценка не должна приводить к переполнению; в противном случае поведение не определено. Если результат указывает один за последний элемент объекта массива, он не должен использоваться в качестве операнда унарного оператора *
, который оценивается.
По существу, делая это, вы пытаетесь получить доступ к какой-памяти, которая не распределяется к процессу, тем самым вызывая undefined behavior.
Выход UB, есть, ну, undefined.
Поиск 'неопределенное поведение'. Нет ничего особо гарантированного существования в '* (указатель + 1)', поскольку код никогда не выделяет и не резервирует для него ничего. Кроме того, пожалуйста, укажите «учебник», чтобы другие знали, чтобы избежать его. – dxiv
Доступ к недопустимой памяти - это неопределенное поведение. Подробнее: [Действительно ли «Неопределенное поведение» действительно разрешает * что-либо?] (Https://stackoverflow.com/questions/32132574/does-undefined-behavior-really-permit-anything-to-happen) и [Не определено , неопределенное и определенное по реализации поведение] (https://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior). – kaylum
@dxiv Я не знаю, является ли это плохим учебником или нет. На самом деле я абсолютный новичок. [link] https://youtu.be/5jQ2ZiXzJjE?t=3m57s –