In C, c'è un solo contesto, in cui è necessario eseguire il cast esplicito di un puntatore nullo a un tipo di puntatore specifico affinché il programma funzioni correttamente. Quel contesto sta passando un puntatore nullo attraverso una lista di argomenti della funzione non tipizzata. In moderno C, questo accade solo quando è necessario passare un puntatore nullo a una funzione che accetta un numero variabile di argomenti. (In legacy C, accade con qualsiasi funzione non dichiarata con un prototipo.) L'esempio paradigmatico è execl
, dove l'ultimo argomento deve essere un puntatore nullo in modo esplicito cast (char *)
:
execl("/bin/ls", "ls", "-l", (char *)0); // correct
execl("/bin/ls", "ls", "-l", (char *)NULL); // correct, but unnecessarily verbose
execl("/bin/ls", "ls", "-l", 0); // undefined behavior
execl("/bin/ls", "ls", "-l", NULL); // ALSO undefined behavior
Sì, questo ultimo esempio ha undefined comportamento anche seNULL
è definito come ((void *)0)
, perché void *
e char *
sono non implicitamente interconvertibili quando attraversarono una lista di argomenti non tipizzato, anche se sono ovunque.
"Sotto il cofano", il problema qui è non solo con lo schema di bit utilizzato per un puntatore nullo, ma che il compilatore potrebbe aver bisogno di conoscere il tipo concreto esatto di ciascun argomento per impostare una chiamata inquadrare correttamente. (Si consideri l'MC68000, con il suo indirizzo separato e registri dati, alcuni argomenti puntatori ABI da passare nei registri degli indirizzi ma argomenti interi nei registri dati. Considera anche qualsiasi ABI dove int
e void *
non hanno le stesse dimensioni. Ed è orribilmente raro oggigiorno , ma C prevede comunque esplicitamente che void *
e char *
non siano della stessa dimensione). Se esiste un prototipo di funzione, il compilatore può utilizzarlo, ma le funzioni non convertite e gli argomenti variadici non offrono tale assistenza.
C++ è più complicato e non mi sento qualificato per spiegare come.
http://bytes.com/topic/c/answers/213647-null-c – soandos
correlati http://stackoverflow.com/questions/459743/is-null-always-false – mcabral
http: // c- faq.com/null/index.html –