2009-08-14 11 views
8

(Sé lo que es nulo y para qué se utiliza)¿qué valor realmente tiene null?

Pregunta: De acuerdo, digamos que hacemos una referencia a un objeto en cualquier idioma. La computadora crea un espacio de 32 bits (o de otro tamaño, según el diseño de la computadora) en la memoria para esa referencia. Esa memoria se puede asignar a un valor que representa la ubicación de un objeto en la memoria. Pero cuando establezco la referencia a nulo, ¿qué valor realmente tiene? (¿Cuáles son los bits individuales en el conjunto de referencia a) Son los bits simplemente a cero? Pero, ¿no sería eso también un lugar en la memoria? ¿Cómo dice la computadora que la referencia contiene nulo en lugar de una referencia a un objeto?

Sé que esta no es una pregunta "importante", pero tengo curiosidad sobre cómo funciona.

Gracias chicos: D

+0

Ver http://en.wikipedia.org/wiki/Pointer_(computing)#The_null_pointer (pero odio simplemente citar Wikipedia en una respuesta). –

Respuesta

14

Hay dos mitades a la respuesta:

  • el valor es cero (es decir, todos los bits en el valor son cero.)
  • cero no se considera una dirección válida.

El segundo punto es por qué la respuesta a su pregunta "¿Pero no sería también una ubicación en la memoria?" es "No" - es simplemente una regla de que cero no se considera una ubicación de memoria válida. Intentar acceder a él provocará una excepción.

Editar:According to Wikipedia (por lo que debe ser verdad 8-) "algunas arquitecturas utilizan un espacio de direcciones firmado y utilizar el valor más negativo". Por lo tanto, no es necesariamente cero en todas las arquitecturas, pero independientemente del valor que tenga en una arquitectura determinada, ese valor se considera una ubicación de memoria no válida.

+2

"es simplemente una regla de que cero no se considera una ubicación de memoria válida" <- esto no es cierto. Es perfectamente legítimo (si es increíblemente desconcertante) mapear 0 a una página válida en algunos sistemas. Sin embargo, en el caso de C y C++ en particular, el estándar exige que 0 sea un puntero no válido, por lo que no estoy seguro de cómo interactúa. – Promit

+4

El estándar no exige que el cero sea una dirección no válida, exige que siempre que compare una dirección con cero, el compilador tenga que traducir ese cero en la dirección incorrecta estándar en esa arquitectura. Es una coincidencia que en x86 Linux la página no válida también sea cero, pero no tiene que ser así. – kmm

7

Viniendo de experiencia en C++ la definición estándar de NULL cuando se habla de punteros es 0. Supongo que funcionan de manera similar a otros idiomas.

+0

Esto es cierto en la mayoría de los idiomas, y solo varía en las CPU/arquitecturas. –

+1

I * vagamente * recuerde que alguna arquitectura (¿una variante PDP?) Tenía un puntero nulo que * no era * nulo, sino que apuntaba a una dirección de memoria que era igualmente inválida para desreferenciar. A pesar de buscar en Google, no puedo encontrar esta referencia. –

+2

No confunda el valor de un puntero nulo en su código C++, que debe ser cero por sección 4.10/1 del estándar C++, y la representación interna del puntero nulo que usa el compilador, que puede ser lo que sea conveniente. –

8

En .NET, los valores nulos están representados por el patrón de bits "todo cero".

Esto es importante, ya que significa que crear correctamente una nueva matriz u objeto solo implica limpiar la memoria para crear valores predeterminados apropiados para todos los campos antes de comenzar a invocar constructores, inicializadores de variables, etc.

(que he estado tratando de encontrar donde se especifica, y yo estoy fallando hasta ahora ... pero es la única aplicación que tiene sentido. Voy a seguir buscando.)

+1

En Ecma334, p122 dice: [Nota: la inicialización a los valores predeterminados normalmente se hace por ... inicializar la memoria a todos los bits cero ... nota final]. Tenga en cuenta el calificador típico y el contexto [Nota]. –

+1

@Henk: Eso es C# - Me restringí muy deliberadamente.NET en lugar de C# :) –

+0

Jon, parece poco probable que un lenguaje específico pueda implementar algo de esto de manera diferente. La nota es sobre 'el administrador de memoria'. –

2

¿Cómo dice la computadora que la referencia contiene nulo en lugar de una referencia a un objeto?

Según Wikipedia, el puntero nulo en ciertos idiomas puede ser una dirección fija en la memoria, que los programas de usuario no puede tener acceso, por lo que si algunos puntos del objeto a esta dirección, es nula, de lo contrario, no lo es.

0

http://googleit1st.com/search?hl=en&q=null+pointer

puntero nulo o de referencia nula Null es un valor de puntero especial (u otro tipo de referencia de objeto) usado para significar que un puntero intencionalmente no apunta a (o se refieren a) un objeto. Tal puntero se llama puntero nulo.1 Muchas implementaciones usan un valor de 0 (todos los bits cero) para representar el puntero nulo, ya que está en la parte inferior del espacio de direcciones de la mayoría de las CPU (aunque algunas arquitecturas usan un espacio de direcciones firmado y usan el valor más negativo). Muchos sistemas operativos generan una excepción cuando se intenta acceder a esta dirección de memoria. Algunos lenguajes usan otra nomenclatura para dicho puntero, por ejemplo, Pascal, Ruby y Lua usan nil 2, Visual Basic usa Nothing y Python usa None. Fortran no considera nulo como una constante, sino una propiedad que puede ser establecida por la directiva NULLIFY y probada por la función ASSOCIATED. Taken from wikipedia

3

No todos los idiomas usan un valor particular, a veces nulo es un objeto. Los lenguajes dinámicos a menudo tienen un objeto global que representa nulo al que se establecen las referencias de objeto cuando no tienen ningún valor. En estos casos, las llamadas a métodos se pueden realizar en el objeto nulo y se pueden crear las respuestas apropiadas.

Por ejemplo, en Ruby hay un singleton llamado nil y métodos comunes como o, nil? y to_s tienen todas las implementaciones predeterminadas apropiadas que esperarías si fueran llamadas al objeto nulo.

En Java null se especifica completamente en la especificación de la máquina virtual. Su valor real no está realmente especificado, más bien lo que debería suceder cuando lo ve una instrucción de código de bytes.

El nulo normalmente se "maneja" estableciendo una referencia de objeto para señalar un objeto nil. Pero los lenguajes con menos abstracciones pueden usar cero como el valor que es una ubicación en la memoria, pero que el sistema operativo no permite que el programa realmente escriba, en lugar de volcar el núcleo o detener el programa.

4

que responder por C#

El CLR tiene un código de operación para nulo.

String s = "ff"; 

    s = null; 

genera esta IL

.locals init ([0] string s) 
    IL_0000: nop 
    IL_0001: ldstr  "ff" 
    IL_0006: stloc.0 
    IL_0007: ldnull 
    IL_0008: stloc.0 

como se puede ver, hay un código de operación ldnull que maneja el valor especial de null

1

La primera página de la memoria RAM suele estar protegida de espacio de usuario programas. De esta forma, si un programador se olvida de buscar un puntero nulo, el programa al menos causará un error de página cuando el programa intente acceder a esa ubicación.

Así que mientras que [0x00000000], es técnicamente una ubicación de memoria real, la mayoría de los programas no pueden acceder a ella.

x86 procesadores tienen una tabla especial allí, si no recuerdo mal.

Cuestiones relacionadas