En C, hay un contexto, y solo uno, donde es necesario convertir explícitamente una constante de puntero nulo en un tipo de puntero específico para que el programa funcione correctamente. Ese contexto pasa un puntero nulo a través de una lista de argumentos de la función sin tipo. En moderno C, esto solo ocurre cuando necesita pasar un puntero nulo a una función que toma una cantidad variable de argumentos. (En el legado C, sucede con cualquier función no declarada con un prototipo.) El ejemplo paradigmático es execl
, donde el último argumento debe ser un puntero nulo convertir explícitamente a (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í, ese último ejemplo sin definir el comportamiento ha incluso siNULL
se define como ((void *)0)
, porque void *
y char *
son no implícitamente interconvertibles cuando pasan a través de una lista de argumentos sin tipo, a pesar de que están en todas partes.
"Bajo el capó", el problema aquí es no acaba con el patrón de bits utilizado para un puntero nulo, pero que el compilador puede necesitar saber el tipo concreto exacta de cada argumento con el fin de establecer una llamada marco correctamente. (Considere el MC68000, con su dirección separada y registros de datos; algunos ABI especifican argumentos de puntero para pasar en los registros de direcciones pero en los registros enteros en los registros de datos. Considere también cualquier ABI donde int
y void *
no son del mismo tamaño. , pero C todavía proporciona explícitamente que void *
y char *
no tengan el mismo tamaño). Si hay un prototipo de función, el compilador puede usarlo, pero las funciones no diseñadas y los argumentos variados no ofrecen tal asistencia.
C++ es más complicado y no me siento capacitado para explicar cómo.
http://bytes.com/topic/c/answers/213647-null-c – soandos
relacionado http://stackoverflow.com/questions/459743/is-null-always-false – mcabral
http: // c- faq.com/null/index.html –