C ne pas interdire le déréférencement de pointeur null, il ne fait que comportement indéfini.
Si votre environnement est telle que vous êtes en mesure de déréférencer un pointeur contenant l'adresse 0x0
, alors vous devriez être en mesure de le faire. La norme du langage C ne dit rien sur ce qui va se passer quand vous le faites. (Et dans la plupart des environnements, le résultat sera un plantage du programme.)
Un exemple concret (si je me souviens bien): Sur le 68k-Soleil 3 ordinateurs, déréférencement d'un pointeur null n'est pas la cause d'un piège; au lieu de cela, le système d'exploitation stockée une valeur de zéro à l'adresse de mémoire à zéro, et le déréférencement d'un pointeur null (qui fait référence à l'adresse zéro) qui donnerait la valeur zéro. Que signifie, par exemple, qu'un programme C peut traiter un pointeur null comme un pointeur valide pour une chaîne vide. Certains logiciels, intentionnellement ou non, dépend de ce comportement. Cela a exigé beaucoup de nettoyage lors du portage de logiciels pour le SPARC-Soleil 4, pris au piège sur pointeur null déréférence. (Je me souviens de la lecture à ce sujet, mais j'ai été incapable de trouver une référence, je vais mettre à jour ce si je peux le trouver.)
Notez que le pointeur null est pas nécessairement l'adresse zéro; plus précisément, la représentation d'une valeur null peut ou ne peut pas être tous les bits à zéro. Très fréquemment, mais il n'est pas garanti. (Si elle ne l'est pas, alors l'entier-à-pointeur de conversion de (void*)0
est non-trivial.)
L'article 5 de la comp.lang.c FAQ traite des pointeurs null.