Разыменовывая неверный указатель, затем беря адрес результата
Рассмотрим:
int* ptr = (int*)0xDEADBEEF;
cout << (void*)&*ptr;
Насколько незаконным является *
, учитывая, что он используется в сочетании с непосредственным &
и при условии, что в игре нет перегруженного op&
/op*
?
(Это имеет особые последствия для адресации элемента массива &myArray[n]
, который явно эквивалентен &*(myArray+n)
. Этот Q & A обращается к более широкому случаю, но я не чувствую, что он действительно удовлетворял вышеупомянутый вопрос.)
Ответы
Ответ 1
Предполагая, что переменная `ptr 'не содержит указателя на действительный объект, поведение undefined происходит, если программе требуется преобразование lvalue-to-r выражение` * ptr', как указано в [conv. lval] (ISO/IEC 14882: 2011, стр. 82, 4.1 [# 1]).
При оценке `& * ptr 'программа не требует преобразования значения lvalue-rval подвыражения` * ptr', согласно [expr.unary.op] (ISO/IEC 14882: 2011, страница 109, 5.3.1 [# 3])
Следовательно, это законно.
Ответ 2
Согласно спецификации, эффект разыменования недействительного указателя сам по себе вызывает поведение undefined. Неважно, что вы делаете после разыменования.
Ответ 3
Это законно. Почему бы и нет? Вы просто устанавливаете значение указателю, а затем получаете доступ к нему. Однако присвоение значения вручную должно быть явно указано как поведение undefined, но это может сказать самая общая спецификация. Затем вы используете его в каком-то встроенном программном контроллере, и он даст вам правильное значение для отображения памяти для некоторого устройства...