Ответы с форумов MSDN

Преобразование типов указателей в C++

Date: 20.03.2018 17:24:57

"что говорит Стандарт по поводу следующей ситуации"

Само по себе, преобразование указателя на переменную из одного типа в другой легально, в любых комбинациях, в том числе удаляя квалификатор const. Это однако не значит, что полученный указатель можно разыменовать и "пользоваться" им (т.е. выполнять операции над указуемым объектом). 

- Работать с объектом разрешено только через указатель на его исходный тип, исходный тип с добавлением const/volatile, или на тип char. Все остальное ведет к неопределенному поведению.  

- Если объект первоначально объявлен как const, попытка изменить его любым путем приводит к неопределенному поведению. (В частности, компилятору разрешено размещать статические константы в области памяти, доступной только для чтения, так что попытка записи туда приведет к ошибке времени выполнения). 

"Мне интересно, указатель на константные данные должен защищать лишь от изменения данных, на которые он указывает"

Да, только от изменения указуемых данных через эту конкретную переменную. 

Message 500

Date: 21.03.2018 5:14:17

В случае динамической памяти да, не приводит. Ограничения, о которых я писал, распространяются только на объекты, объявленные в коде (локальные или глобальные переменные). Для динамически выделенной памяти не имеет смысла понятие "исходный тип данных", соответственно любой указатель легален.


Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub