( Lea este párrafo antes de leer la publicación.Le pido a cualquier persona interesada en leer esta publicación que intente leerla con atención y, por supuesto, no la rechace hasta que la entienda completamente, gracias. )
Ahora es un wiki de la comunidad, como tal, si alguien no está de acuerdo con alguno de los conceptos, modifíquelo, con una explicación clara y detallada de qué está mal y por qué, y si es posible, cite las fuentes o proporcione pruebas que puedan reproducirse.
Responder
Aquí hay algunas otras razones que podrían ser los factores subyacentes de NULL == 0
- El hecho de que cero es falso, por lo que se puede hacer directamente en
if(!my_ptr)
lugar de if(my_ptr==NULL)
.
- El hecho de que los enteros globales no iniciados se inicialicen de forma predeterminada en todos los ceros y, como tal, un puntero de todos los ceros se consideraría no inicializado.
Aquí me gustaría decir unas palabras sobre otras respuestas
No por el azúcar sintáctico
Decir que NULL es cero debido al azúcar sintáctico no tiene mucho sentido, si es así, ¿por qué no usar el índice 0 de una matriz para mantener su longitud?
De hecho, C es el lenguaje que más se parece a la implementación interna, ¿tiene sentido decir que C eligió cero solo por el azúcar sintáctico? ¡Preferirían proporcionar una palabra clave nula (como hacen muchos otros lenguajes) en lugar de asignar cero a NULL!
Como tal, aunque a partir de hoy podría ser simplemente azúcar sintáctico, está claro que la intención original de los desarrolladores del lenguaje C no era el azúcar sintáctico, como mostraré más adelante.
1) La especificación
Sin embargo, si bien es cierto que la especificación C habla de la constante 0 como el puntero nulo (sección 6.3.2.3), y también define NULL para ser definido por implementación (sección 7.19 en la especificación C11 y 7.17 en la especificación C99), el El hecho es que en el libro "El lenguaje de programación C" escrito por los inventores de C se indica lo siguiente en la sección 5.4:
C garantiza que cero nunca es una dirección válida para los datos, por lo que se puede usar un valor de retorno de cero para señalar un evento anormal, en este caso, sin espacio.
El puntero y los números enteros no son intercambiables, el cero es la única excepción: el cero constante puede asignarse a un puntero y un puntero puede compararse con el cero constante. La constante simbólica NULL se usa a menudo en lugar de cero, como mnemotécnico para indicar más claramente que este es un valor especial para un puntero. NULL se define en. De ahora en adelante usaremos NULL.
Como se puede ver (de las palabras "dirección cero") al menos la intención original de los autores de C era la dirección cero, y no el cero constante, además se desprende de este extracto que la razón por la cual la especificación habla de la La constante cero probablemente no excluya una expresión que se evalúe como cero, sino que incluya la constante entera cero para que sea la única constante entera permitida para su uso en un contexto de puntero sin conversión.
2) Resumen
Si bien la especificación no dice explícitamente que una dirección cero puede tratarse de manera diferente a la constante cero, no dice que no, y el hecho de que cuando se trata de la constante de puntero nulo no afirma que sea una implementación definida como lo hace por la constante definida NULL , en su lugar afirma que es cero, muestra que podría haber una diferencia entre la constante cero y la dirección cero.
(Sin embargo, si este es el caso, me pregunto por qué NULL es la implementación definida, ya que en tal caso NULL también puede ser el cero constante, ya que el compilador de todos modos tiene que convertir todas las constantes cero en la implementación real definida como NULL).
Sin embargo, no veo esto en acción real, y en las plataformas generales la dirección cero y la constante cero se tratan de la misma manera y arrojan el mismo mensaje de error.
Además, el hecho es que los sistemas operativos de hoy en día están reservando toda la primera página (rango 0x0000 a 0xFFFF), solo para evitar el acceso a la dirección cero debido al puntero NULL de C (consulte http://en.wikipedia.org/wiki/ Zero_page , así como "Windows Via C / C ++ por Jeffrey Richter y Christophe Nasarre (publicado por Microsoft Press)").
Por lo tanto, le pediría a cualquiera que afirme haberlo visto en acción, que especifique la plataforma y el compilador, y el código exacto que realmente hizo (aunque debido a la definición vaga en la especificación [como he mostrado] cualquier compilador y la plataforma es libre de hacer lo que quiera).
Sin embargo, aparentemente parece que los autores de C no tenían esto en mente, y estaban hablando de la "dirección cero", y que "C garantiza que nunca es una dirección válida", así como "NULL es solo una mnemónico ", mostrando claramente que su intención original no era para" azúcar sintáctico ".
No por el sistema operativo
También alegando que el sistema operativo niega el acceso a la dirección cero, por algunas razones:
1) Cuando se escribió C, no existía tal restricción, como se puede ver en esta página de wikipage http://en.wikipedia.org/wiki/Zero_page .
2) El hecho es que los compiladores de C accedieron a la dirección de memoria cero.
Este parece ser el hecho del siguiente artículo de BellLabs ( http://www.cs.bell-labs.com/who/dmr/primevalC.html )
Los dos compiladores difieren en los detalles de cómo afrontan esto. En el anterior, el comienzo se encuentra nombrando una función; en el último, el inicio simplemente se toma como 0. Esto indica que el primer compilador se escribió antes de que tuviéramos una máquina con mapeo de memoria, por lo que el origen del programa no estaba en la ubicación 0, mientras que en el momento del segundo, teníamos un PDP-11 que proporcionaba mapas.
(De hecho, a partir de hoy (como cité las referencias anteriores de wikipedia y microsoft press), la razón para restringir el acceso a la dirección cero se debe a los punteros NULL de C, ¡así que al final resulta ser al revés!)
3) Recuerde que C también se usa para escribir sistemas operativos, ¡e incluso compiladores de C!
De hecho, C fue desarrollado con el propósito de escribir el sistema operativo UNIX con él y, como tal, no parece haber ninguna razón por la que deban restringirse desde la dirección cero.
(Hardware) Explicación sobre cómo las computadoras son (físicamente) capaces de acceder a la dirección cero
Hay otro punto que quiero explicar aquí, ¿cómo es posible hacer referencia a la dirección cero?
Piénselo por un segundo, las direcciones son buscadas por el procesador y luego enviadas como voltajes en el bus de memoria, que luego es utilizado por el sistema de memoria para llegar a la dirección real y, sin embargo, una dirección de cero significará que no hay voltaje. , entonces, ¿cómo accede el hardware físico del sistema de memoria a la dirección cero?
La respuesta parece ser que la dirección cero es la predeterminada y, en otras palabras, el sistema de memoria siempre puede acceder a la dirección cero cuando el bus de memoria está completamente apagado y, como tal, cualquier solicitud de lectura o escritura sin especificar una dirección real (que es el caso de la dirección cero) accede automáticamente a la dirección cero.
if (p != 0)
aif (p)
cuál es un lenguaje común en C y C ++, aunque tendrás que dejar el hábito si empiezas a utilizar Java.