Подтвердить что ты не робот

Разыменовывая неверный указатель, затем беря адрес результата

Рассмотрим:

int* ptr = (int*)0xDEADBEEF;
cout << (void*)&*ptr;

Насколько незаконным является *, учитывая, что он используется в сочетании с непосредственным & и при условии, что в игре нет перегруженного op&/op*?


(Это имеет особые последствия для адресации элемента массива &myArray[n], который явно эквивалентен &*(myArray+n). Этот Q & A обращается к более широкому случаю, но я не чувствую, что он действительно удовлетворял вышеупомянутый вопрос.)

4b9b3361

Ответ 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, но это может сказать самая общая спецификация. Затем вы используете его в каком-то встроенном программном контроллере, и он даст вам правильное значение для отображения памяти для некоторого устройства...