2011-09-30 16 views

Respuesta

7

La ISO/IEC 9899: estados TC2 en 6.3.2.3 Pointers

3 Un entero expresión constante con el valor 0, o un reparto tan expresión para escribir void *, que se llama un constant.55 puntero null) Si una constante puntero nulo se convierte en un tipo de puntero, el puntero resultante, llamado un puntero nulo, está garantizada para comparar desigual a un puntero a cualquier objeto o función

el NULL macro expande a una implementación definida constante de puntero nulo.

Cualquiera dos punteros nulos se compararán iguales.

6

Sí, sí. El estándar dicta que NULL siempre apunta a la memoria no válida. Pero no indica que la representación entera del puntero deba ser 0. Nunca me encontré con una implementación para la cual NULL fuera distinto de 0, pero eso no es un requisito del estándar.

Tenga en cuenta que la asignación del literal 0 a un puntero no significa que el puntero asume la representación entera de 0. Significa que el valor del puntero nulo especial se asigna a la variable del puntero.

+1

relevante: http://c-faq.com/null/machexamp.html – nos

+7

También tenga en cuenta que 'int * ptr = 0;' siempre da como resultado un puntero nulo gracias a una regla especial, porque '0' es un llamada "constante de puntero nulo". Esto se mantiene incluso si se encuentra en alguna implementación peculiar donde un puntero nulo es diferente de la dirección 0. Sin embargo, 'int i = 0; int * ptr = (int *) i; 'no da necesariamente como resultado un puntero nulo. Por lo tanto, normalmente no encontrará "un puntero que apunta a la dirección 0", excepto en un contexto en el que es un puntero nulo, pero el estándar lo permite. –

+0

@David, en su segundo párrafo quiere decir "no", ¿verdad? Y 'NULL' es siempre un valor' 0' por definición del estándar, que podría ser una dirección válida, por ejemplo, en el kernel. Entonces uno debería distinguir mejor a 'NULL' más claramente de la representación interna de un puntero nulo, que, como dices podría ser algo diferente. –

3

La evaluación del literal 0 en un contexto de puntero es idéntica a NULL. Cualquier patrón de bits que el compilador use para representar un puntero NULL está oculto.

1

Las viejas preguntas frecuentes sobre comp.lang.c tienen una gran sección en el puntero nulo y vale la pena leerlas.

comp.lang.c null pointers

0

La idea es que un puntero NULL debe de alguna manera representan un área de memoria que no es válido.
Así que en los segmentos de memoria inferiores se mapea el código del sistema operativo, se ha utilizado el valor 0 (para representar el puntero NULL) ya que esta área en la memoria no pertenece al programa del usuario sino que está asignada al código del sistema operativo.

Cuestiones relacionadas