Ответ 1
Стандарт помещает реализации в две общие категории:
- Те, у кого строгая безопасность указателей
- Те, у кого есть расслабленная безопасность указателей
Ваше выражение определенно не является безопасным образом, так как оно недействительно в первом.
Цитата из 3.7.4.3:
Реализация может иметь расслабленную безопасность указателя, и в этом случае ценность значения указателя не зависит от того, является ли это безопасным производным значением указателя. В качестве альтернативы, реализация может иметь строгую безопасность указателей, и в этом случае значение указателя, относящееся к объекту с динамической продолжительностью хранения, которое не является безопасным производным значением указателя, является недопустимым значением указателя, если только объявленный полный объект ранее не был объявлен достижимым (20.7 +0,4). [Примечание: эффект использования недопустимого значения указателя (включая передачу его функции освобождения) равен undefined, см. 3.7.4.2. Это справедливо даже в том случае, если значение указателя, которое не имеет значения, могло бы сравниться с каким-либо безопасным производным значением указателя. - end note] Реализация определяется, была ли релаксация реализации или строгая безопасность указателя.
Для реализаций с расслабленной безопасностью не имеет значения, как получено значение указателя, просто (3.9.2):
Допустимое значение типа указателя объекта представляет собой либо адрес байта в памяти (1.7), либо нулевой указатель.
Является ли 0x1
допустимым адресом памяти в вашей системе? Ну, для некоторых встроенных систем это так. Для большинства ОС, использующих виртуальную память, страница, начинающаяся с нуля, зарезервирована как недействительная.