normalmente NULL è definito da una macro, che potrebbe somigliare a questa
codice:
#ifndef NULL
#if defined(_KERNEL) || !defined(__cplusplus)
#define NULL    ((void *)0)
#else
#if defined(__LP64__)
#define NULL    (0L)
#else
#define NULL    0
#endif  /* __LP64__ */
#endif  /* _KERNEL || !__cplusplus */
#endif
Hai ragione, normalmente NULL è utilizzata per identificare una locazione di memoria non valida, ma il suo valore non vedo come possa esere differente da zero.
ciao
sergio