Очевидно, что разыменование недопустимого указателя вызывает неопределенное поведение. Но как насчет простого сохранения недопустимого адреса памяти в переменной-указателе?
Рассмотрим следующий код:
const char* str = "abcdef";
const char* begin = str;
if (begin - 1 < str) { /* ... do something ... */ }
Выражение begin - 1
оценивается как недопустимый адрес памяти. Обратите внимание, что на самом деле мы не разыменовываем этот адрес - мы просто используем его в арифметике указателей, чтобы проверить, действителен ли он Тем не менее, нам все равно придется загрузить неверный адрес памяти в регистр.
Итак, это неопределенное поведение? Я никогда не думал, что это так, поскольку большая часть арифметики указателей, похоже, полагается на такого рода вещи, а указатель на самом деле является не чем иным, как целым числом. Но недавно я услышал, что даже загрузка недопустимого указателя в регистр является неопределенным поведением, так как некоторые архитектуры автоматически вызывают ошибку шины или что-то в этом роде, если вы это сделаете. Может ли кто-нибудь указать мне на соответствующую часть стандарта C или C ++, которая решает это в любом случае?