Я скомпилировал некоторый код, используя gcc для Motorola HC11, у которого нет MMU и 0 - это совершенно хороший адрес, и был разочарован, узнав, что для записи по адресу 0 вы просто пишете в него. Нет разницы между NULL и адресом 0.
И я понимаю, почему. Я имею в виду, что на самом деле невозможно определить уникальный NULL в архитектуре, где каждая ячейка памяти потенциально допустима, поэтому я предполагаю, что авторы gcc просто сказали, что 0 достаточно для NULL, независимо от того, является ли это действительным адресом или нет.
char *null = 0;
; Clears 8-bit AR and BR and stores it as a 16-bit pointer on the stack.
; The stack pointer, ironically, is stored at address 0.
1b: 4f clra
1c: 5f clrb
1d: de 00 ldx *0 <main>
1f: ed 05 std 5,x
Когда я сравниваю его с другим указателем, компилятор генерирует регулярное сравнение. Это означает, что он никоим образом не считает char *null = 0
специальным указателем NULL, и фактически указатель на адрес 0 и указатель «NULL» будут равны.
; addr is a pointer stored at 7,x (offset of 7 from the address in XR) and
; the "NULL" pointer is at 5,y (offset of 5 from the address in YR). It doesn't
; treat the so-called NULL pointer as a special pointer, which is not standards
; compliant as far as I know.
37: de 00 ldx *0 <main>
39: ec 07 ldd 7,x
3b: 18 de 00 ldy *0 <main>
3e: cd a3 05 cpd 5,y
41: 26 10 bne 53 <.LM7>
Итак, чтобы ответить на исходный вопрос, я думаю, что мой ответ - проверить реализацию вашего компилятора и выяснить, не потрудились ли они реализовать NULL с уникальным значением. Если нет, вам не нужно беспокоиться об этом. ;)
(Конечно, этот ответ не соответствует стандарту.)