2009-08-14 21 views
8

(So cos'è null e a cosa serve)che valore ha veramente?

Domanda: OK, diciamo di fare riferimento a un oggetto in qualsiasi lingua. Il computer crea un po 'di spazio a 32 bit (o altre dimensioni, in base al design del computer) in memoria per quel riferimento. Quella memoria può essere assegnata a un valore che rappresenta la posizione di un oggetto in memoria. Ma quando imposto il riferimento a null, quale valore ha davvero? (quali sono i singoli bit nel set di riferimento su) I bit sono appena azzerati? Ma non sarebbe anche una posizione nella memoria? In che modo il computer dice che il riferimento contiene null invece di un riferimento a un oggetto?

So che questa non è una domanda "importante", ma sono curioso di sapere come funziona. ragazzi

Grazie: D

+0

Vedere http://en.wikipedia.org/wiki/Pointer_(computing)#The_null_pointer (ma odio solo citare Wikipedia in una risposta). –

risposta

14

Ci sono due metà alla risposta:

  • il valore è zero (cioè tutti i bit del valore sono pari a zero.)
  • zero è mai considerato un indirizzo valido.

Il secondo punto è il motivo per cui la risposta alla tua domanda "Ma non sarebbe anche una posizione in memoria?" è "No" - è semplicemente una regola che zero non è considerato un luogo di memoria valido. Tentare di accedervi causerà un'eccezione.

Edit:According to Wikipedia (quindi deve essere vero 8-) "alcune architetture si usa uno spazio di indirizzi firmato e utilizzare il valore più negativo". Quindi non è necessariamente zero su tutte le architetture, ma qualunque valore abbia su una data architettura, quel valore è considerato una locazione di memoria non valida.

+2

"è semplicemente una regola che zero non è considerato una posizione di memoria valida" <- non è vero. È perfettamente legittimo (se incredibilmente sconcertante) mappare 0 su una pagina valida su alcuni sistemi. Tuttavia, nel caso di C e C++ in particolare, lo standard richiede che 0 sia un puntatore non valido, quindi non sono sicuro di come questo interagisca. – Promit

+4

Lo standard non richiede che zero sia un indirizzo non valido, richiede che ogni volta che si confronta un indirizzo con zero, il compilatore debba tradurre tale zero nell'indirizzo errato standard su tale architettura. È un po 'una coincidenza che su x86 Linux anche la pagina non valida sia zero, ma non deve esserlo. – kmm

7

Venendo da uno sfondo la definizione standard di NULL C++ quando si parla di puntatori è 0. presumo che altre lingue funzionano in modo simile.

+0

Questo è vero nella maggior parte delle lingue e varia solo in base a CPU/architetture. –

+1

I * vagamente * ricordo che qualche architettura (una variante PDP?) Aveva un puntatore nullo che * non era * null, ma puntava a un indirizzo di memoria che era ugualmente non valido per il dereferenziamento. Nonostante Google non riesco a trovare questo riferimento. –

+2

Non confondere il valore di un puntatore nullo nel codice C++, che deve essere zero per sezione 4.10/1 dello standard C++ e la rappresentazione interna del puntatore nullo utilizzato dal compilatore, che può essere qualsiasi cosa conveniente. –

8

In .NET, i valori nulli sono rappresentati dal modello di bit "tutto zero".

Questo è importante, poiché significa che la corretta creazione di un nuovo array o oggetto comporta solo la cancellazione della memoria per creare valori predefiniti appropriati per tutti i campi prima di iniziare a richiamare costruttori, inizializzatori variabili ecc. Ove appropriato.

(ho cercato di trovare in cui questo viene specificato, e sto in mancanza finora ... ma è l'unica applicazione che ha un senso. Terrò cercando.)

+1

In Ecma334, p122, si dice: [Nota: l'inizializzazione su valori predefiniti viene in genere eseguita da ... Inizializza memoria su all-bit-zero ... nota finale]. Notare il qualificatore tipico e il contesto [Nota]. –

+1

@Henk: Questo è C# - Mi sono deliberatamente limitato a me stesso.NET invece di C# :) –

+0

Jon, sembra improbabile che una lingua specifica possa implementare una di queste cose in modo diverso. La nota riguarda "il gestore della memoria". –

2

In che modo il computer indica che il riferimento contiene null anziché un riferimento a un oggetto?

Secondo Wikipedia, il puntatore nullo in alcune lingue può essere un indirizzo fisso in memoria, quali programmi utente possono accedere, quindi se alcuni punti di oggetto a questo indirizzo, è nullo, altrimenti, non è.

0

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

Null puntatore o riferimento null Null è un valore speciale puntatore (o altro tipo di riferimento oggetto) usato per indicare che un puntatore intenzionalmente non punta (o riferirsi) un oggetto. Tale puntatore è chiamato puntatore nullo.1 Molte implementazioni utilizzano il valore 0 (tutti i bit zero) per rappresentare il puntatore nullo, poiché si trova nella parte inferiore dello spazio di indirizzi della maggior parte delle CPU (sebbene alcune architetture utilizzino uno spazio di indirizzi firmato e utilizzino il valore più negativo). Molti sistemi operativi generano un'eccezione quando si tenta di accedere a questo indirizzo di memoria. Alcune lingue usano un'altra nomenclatura per tale puntatore, ad esempio Pascal, Ruby e Lua utilizzano nil 2, Visual Basic utilizza Nothing e Python utilizza None. Fortran non considera null come una costante, ma una proprietà che può essere impostata dalla direttiva NULLIFY e testata dalla funzione ASSOCIATED. Taken from wikipedia

3

Non tutte le lingue utilizzano un valore particolare, a volte null è un oggetto. I linguaggi dinamici hanno spesso un oggetto globale che rappresenta null a cui i riferimenti oggetto sono impostati quando non hanno alcun valore. In questi casi è possibile effettuare chiamate al metodo sull'oggetto null e creare risposte appropriate.

Ad esempio in Ruby c'è un singleton chiamato nil e metodi comuni come o, nil? e to_s hanno tutte implementazioni predefinite appropriate che ci si aspetterebbe se fossero chiamate sull'oggetto null.

In Java null è specificato a fondo nelle specifiche della macchina virtuale. Il suo valore reale non è realmente specificato, piuttosto che cosa dovrebbe accadere quando l'istruzione di un codice byte lo vede.

Il valore Null viene normalmente "gestito" impostando un riferimento oggetto in modo che punti a un oggetto nullo. Ma le lingue con astrazioni più basse possono usare zero come valore che è una posizione in memoria, ma una che il sistema operativo impedisce al programma di scrivere effettivamente, invece di eliminare il programma o di interrompere il programma.

4

rispondere di C#

Il CLR ha un codice operativo per nulla.

String s = "ff"; 

    s = null; 

genera questa IL

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

come potete vedere, c'è un codice operativo ldnull che gestisce il particolare valore di null

1

La prima pagina di RAM è di solito protetto dallo user-space programmi. In questo modo, se un programmatore dimentica di controllare un puntatore nullo, il programma causerà almeno un errore di pagina, quando il programma tenta di accedere a tale posizione.

Così mentre [0x00000000], è tecnicamente una posizione di memoria reale, la maggior parte dei programmi non può accedervi.

processori x86 hanno un tavolo speciale, se non ricordo male.

Problemi correlati