Разыменование неверного указателя, затем получение адреса результата - PullRequest
23 голосов
/ 08 сентября 2011

Рассмотрим:

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

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


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

Ответы [ 3 ]

18 голосов
/ 08 сентября 2011

Согласно спецификации, эффект разыменования недопустимого указателя сам по себе приводит к неопределенному поведению.Неважно, что вы делаете после разыменования.

16 голосов
/ 28 октября 2011

Предполагая, что переменная `ptr 'не содержит указатель на действительный объект, неопределенное поведение происходит, если программе требуется преобразование lvalue-to-rvalue выражения` * ptr', как указано в [conv.lval](ИСО / МЭК 14882: 2011, стр. 82, 4.1 [# 1]).

Во время оценки `& * ptr 'программе не требуется преобразование lvalue-to-rvalue подвыражения` *ptr ', в соответствии с [expr.unary.op] (ISO / IEC 14882: 2011, стр. 109, 5.3.1 [# 3])

Следовательно, это законно.

2 голосов
/ 08 сентября 2011

Это является законным. Почему бы не быть? Вы просто устанавливаете значение для указателя, а затем получаете к нему доступ. Однако назначение значения вручную должно быть явно задано как неопределенное поведение, но это самая общая спецификация, которую можно сказать. Затем вы используете его в каком-то встроенном программном контроллере, и он даст вам правильное отображенное в памяти значение для некоторого устройства ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...