Решение состоит в том, чтобы не записывать в произвольные области памяти: -)
Более подробно, стандартные состояния C11 оператора косвенного обращения *
:
Унарный оператор *
обозначает косвенность. Если операнд указывает на функцию, результатом является обозначение функции; если он указывает на объект, результатом является lvalue, обозначающее объект. Если операнд имеет тип «указатель на тип», результат имеет тип «тип». Если указателю присвоено недопустимое значение, поведение унарного оператора *
не определено.
Этот абзац ссылается на сноску 102, который гласит:
Среди недопустимых значений для разыменования указателя унарным оператором *
нулевой указатель, адрес, неправильно выровненный для тип объекта, на который указывает объект, и адрес объекта по истечении срока его жизни.
Обратите внимание, что это не исчерпывающий список , вы, вероятно, все равно попадете в проблема, если вы используете 0x01
, а не NULL
-эквивалент 0x00
. Если вы не знаете , что ваша реализация разрешает доступ (например, адреса ввода-вывода с отображением в памяти), вам действительно нужно писать только по адресам, для которых вы знаете, что существует объект C некоторого описания.