Основная причина заключается в том, что к тому времени, когда они написали оригинальный стандарт C, было несколько реализаций, которые позволяли это, но давали противоречивые результаты.
На PDP-11 случалось, что адрес 0 всегдасодержит значение 0, поэтому разыменование нулевого указателя также дает значение 0. Довольно немногие люди, которые использовали эти машины, считали, что, поскольку они были исходной машиной, на которой C был написан / использовался для программирования, это следует рассматривать как каноническое поведение дляC на всех машинах (хотя изначально это произошло совершенно случайно).
На некоторых других машинах (вспоминаются Interdata, хотя моя память может легко ошибаться) адрес 0 был переведен в нормальное состояние, поэтому он мог содержатьдругие ценности.Было также какое-то оборудование, на котором адрес 0 был фактически некоторым отображенным в память оборудованием, поэтому чтение / запись выполнялись особыми вещами - совсем не эквивалентно чтению / записи обычной памяти.
Лагеря не хотели быЯ не могу согласиться с тем, что должно произойти, поэтому они сделали это неопределенным поведением.
Редактировать: Полагаю, мне следует добавить, что к тому времени, когда был написан стандарт C ++, его поведение с неопределенным поведением уже было хорошо установлено в C, и (по-видимому) никто не думал, что есть веская причина для создания конфликта по этому вопросу, поэтому они не изменили.