к ненулевому значению сломает этот код:

у код C для системы, где адрес 0x0000 является действительным и содержит порт ввода-вывода. Поэтому любые возможные ошибки, которые обращаются к нулевому указателю, останутся незамеченными и в то же время вызовут опасное поведение.

По этой причине я хочу переопределить NULL, чтобы он стал другим адресом, например, адресом, который недействителен. Если я случайно получу доступ к такому адресу, я получу аппаратное прерывание, где я могу обработать ошибку. У меня есть доступ к stddef.h для этого компилятора, поэтому я могу изменить стандартный заголовок и переопределить NULL.

Мой вопрос: будет ли это противоречить стандарту C? Насколько я могу сказать из 7.17 в стандарте, макрос определяется реализацией. Есть ли что-нибудь еще в стандарте, утверждающее, что NULLдолжен быть 0?

Другая проблема заключается в том, что множество компиляторов выполняют статическую инициализацию, устанавливая все на ноль, независимо от типа данных. Хотя в стандарте сказано, что компилятор должен устанавливать целые числа в ноль и указатели в NULL. Если бы я переопределил NULL для моего компилятора, то я знаю, что такая статическая инициализация не удастся. Могу ли я считать это неправильным поведением компилятора, хотя я смело изменял заголовки компилятора вручную? Потому что я точно знаю, что этот конкретный компилятор не обращается к макросу NULL при статической инициализации.

Ответы на вопрос(7)

Ваш ответ на вопрос