¿NULL siempre es falso?

¿Es seguro suponer que NULL siempre se traduce en falso en C?

 void *somePtr = NULL; if (!somePtr) { /* This will always be executed? */ } 

¿O debería hacerse una comprobación explícita contra el valor de NULL ?

Sí. NULL evalúa como falso, ya que C considera verdadero cualquier valor distinto de cero y falso cualquier valor cero. NULL es esencialmente la dirección zero y se trata como tal en las comparaciones, y creo que sería promovido a un int para la verificación booleana. Esperaría que tu código sea legible para cualquiera que esté familiarizado con C aunque probablemente haga que el cheque sea explícito.

En la progtwigción C y C ++, dos punteros nulos tienen la garantía de comparar iguales; ANSI C garantiza que cualquier puntero nulo será igual a 0 en una comparación con un tipo entero; además, la macro NULL se define como una constante de puntero nulo, que es el valor 0 (ya sea como un tipo entero o convertido a un puntero a void), por lo que un puntero nulo se comparará igual a NULL.

Ref: http://en.wikipedia.org/wiki/Null_pointer#Null_pointer

Nunca es seguro asumir nada.

Una comprobación explícita también es más clara sobre lo que está probando.

El lenguaje ‘C’ data de una época en la que (void *) 0 podría ser realmente un puntero válido. No hace mucho tiempo, los microprocesadores 8080 y Z80 tenían un vector de interrupción en la dirección 0. Frente a tales elecciones de architecture, no podía hacer otra cosa que dejar que un archivo de cabecera declarara el valor de NULL. Había algunos comstackdores, ahora olvidados desde hacía mucho tiempo, donde NULL no era igual a (void *) 0 (0xffff era la siguiente alternativa), dando así a su comportamiento indefinido de statement if ().

C ++ afortunadamente puso fin a esto, un puntero nulo es asignable y comprobable contra 0.

Sí (al menos para cualquier comstackdor C que cumpla con los estándares)

De las preguntas frecuentes de comp.lang.c :

P: ¿Es válida la comparación de puntero abreviado “ if (p) ” para probar punteros no nulos? ¿Qué pasa si la representación interna para punteros nulos es distinta de cero?

R: Siempre es válido.

NULL es solo una definición de preprocesador. Está en stdio.h. Típicamente, solo una persona demente lo redefiniría, pero es posible. Un ejemplo:

 #include  #ifdef NULL #undef NULL #define NULL 1 #endif void main() { if (NULL) printf("NULL is true\n"); else printf("NULL is false\n"); } 

Este código imprimirá “NULL es verdadero”. Pruébalo si no me crees. Tu comstackdor podría incluso no advertirte que estás haciendo algo extraño.

NULL se define como un puntero constante que garantiza que apunta a un lugar inútil / inexistente en la memoria. La mayoría de las implementaciones de NULL son ((void *)0) pero no es obligatorio que esto sea así.

Simplemente lo remito a la Pregunta 5.3 de C-FAQ. Responde a esta pregunta exacta.

Sí, principalmente.

Primero, NULL es un typedef. Realmente podría joderte diciendo en un encabezado incluido previamente

 #define NULL 1 

Esto puede no tener mucho sentido, pero ¿desde cuándo el código de otras personas tuvo sentido alguna vez? 🙂

Además, aunque es probablemente sintácticamente seguro, no es semánticamente correcto. NULL significa “nada”, verdadero o falso o un valor booleano o int o cadena. Significa “un símbolo por nada”. Entonces, probar NULL es más como un problema filosófico: si un árbol cae en el bosque, y if(listener) , ¿hace un sonido?

Haga un favor a todos y tenga en claro las pruebas contra NULL.

* NULL siempre apunta a 0x00L. Puede considerar que es falso, pero asegúrese de hacer siempre una comprobación explícita.