Ссылка инициализируется разыменованным указателем. Почему такое поведение?

int x = 5;
int *px = &x;
int &rx = *(px+1000);
rx = 7; // ошибка иногда


Если указатель px сдвинуть на небольшое число, например на 10, то ошибка при исполнении операции ra = 7 не возникает, если на большое, например, на 1000, то возникает. От чего это зависит? За пределы чего выходим в памяти?
  • Вопрос задан
  • 99 просмотров
Решения вопроса 1
Напомню лишний раз, что не важно, остаётся ли жива программа, запись по такому указателю представляет собой неопределённое поведение (Undefined Behavior). Это значит, формально, программа может форматнуть жёсткий диск или призвать демонов. Почему компилятор или программа не ловит такие ошибки — проверять доступ к памяти накладно, поэтому приходится всецело доверять тому, что ты знаешь, что делаешь.

На заметку, это тоже неопределённое поведение:
int a = 1;
int b = 2;
*(&a + 1) = 42;

Ходить указателями разрешается только в пределах массива.

UPD: Даже сама операция сложения, без разыменования - уже UB (пруф):
*(&a + 2 - 2) = 42; // UB
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@none7
Стек(хранилище локальных переменных и адресов возврата из функций) смещается сверху вниз(stack -= sizeof(struct allvalrs) / sizeof(void*)). То есть при запуске нового потока, его указатель стека находится на вершине. Соответственно Ваш код размещает переменные чуть ниже вершины и любой значительный плюс приводит указатель в не выделенную область памяти.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы