Welchen Wert hat null wirklich?

8

(Ich weiß, was Null ist und wofür es verwendet wird)

Frage: OK, sagen wir, wir beziehen uns auf ein Objekt in welcher Sprache auch immer. Der Computer erstellt für diese Referenz einen Speicherplatz von 32 Bit (oder eine andere Größe, abhängig vom Computerdesign). Dieser Speicher kann einem Wert zugewiesen werden, der den Speicherort eines Objekts im Speicher darstellt. Aber wenn ich den Verweis auf null setze, welchen Wert hat es wirklich? (Was sind die einzelnen Bits in der Referenz auf) Sind die Bits gerade auf Null gesetzt? Aber wäre das nicht auch ein Ort in Erinnerung? Wie sagt der Computer, dass die Referenz null statt einer Referenz auf ein Objekt enthält?

Ich weiß, das ist keine "wichtige" Frage, aber ich bin gespannt, wie es funktioniert.

Danke Leute: D

    
Gordon Gustafson 14.08.2009, 16:34
quelle

8 Antworten

14

Es gibt zwei Hälften der Antwort:

  • der Wert ist Null (dh alle Bits im Wert sind Null)
  • Null wird niemals als gültige Adresse betrachtet.

Der zweite Punkt ist warum die Antwort auf Ihre Frage "Aber wäre das nicht auch ein Ort in Erinnerung?" ist "Nein" - es ist einfach eine Regel, dass Null nicht als gültiger Speicherort gilt. Der Versuch, darauf zuzugreifen, wird eine Ausnahme verursachen.

Bearbeiten: Laut Wikipedia (so muss es wahr sein 8 -) "Einige Architekturen verwenden einen vorzeichenbehafteten Adressraum und verwenden den negativsten Wert". Es ist also nicht notwendigerweise Null auf allen Architekturen, aber welcher Wert auch immer in einer bestimmten Architektur gilt, dieser Wert wird als ungültiger Speicherort betrachtet.

    
RichieHindle 14.08.2009, 16:40
quelle
8

In .NET werden Nullwerte durch das Bitmuster "all zero" dargestellt.

Dies ist wichtig, da dies bedeutet, dass das korrekte Erstellen eines neuen Arrays oder Objekts nur den Speicher löscht, um geeignete Standardwerte für alle Felder zu erstellen, bevor gegebenenfalls Konstruktoren, Variableninitialisierungen usw. aufgerufen werden.

(Ich habe versucht herauszufinden, wo das angegeben ist, und ich scheitere bis jetzt ... aber es ist die einzige Implementierung, die einen Sinn ergibt. Ich werde weiter nachsehen.)

    
Jon Skeet 14.08.2009 16:39
quelle
7

Ausgehend von einem C ++ - Hintergrund ist die Standarddefinition von NULL bei Zeigern 0. Ich würde annehmen, dass andere Sprachen ähnlich funktionieren.

    
DeusAduro 14.08.2009 16:37
quelle
4

Um für c # zu antworten

Die CLR hat einen Opcode für null.

%Vor%

erzeugt dieses IL

%Vor%

Wie Sie sehen können, gibt es einen ldnull-Opcode, der den speziellen Wert von null behandelt

    
sylvanaar 14.08.2009 17:06
quelle
3

Nicht alle Sprachen verwenden einen bestimmten Wert, manchmal ist null ein Objekt. Dynamische Sprachen haben oft ein globales Objekt, das null darstellt, auf das Objektreferenzen gesetzt werden, wenn sie keinen Wert haben. In diesen Fällen können Methodenaufrufe für das Nullobjekt und entsprechende Antworten erstellt werden.

Zum Beispiel gibt es in Ruby einen Singleton namens nil und allgemeine Methoden wie oder, nil? und to_s haben alle geeignete Standardimplementierungen, die Sie erwarten würden, wenn sie für das Nullobjekt aufgerufen würden.

In Java ist null in der Spezifikation der virtuellen Maschine genau angegeben. Sein tatsächlicher Wert ist nicht wirklich spezifiziert, sondern was passieren soll, wenn ein Byte-Code-Befehl es sieht.

Null wird normalerweise "behandelt", indem ein Objektverweis so eingestellt wird, dass er auf ein Nullobjekt zeigt. Aber Sprachen mit niedrigeren Abstraktionen können Null als den Wert verwenden, der ein Ort im Speicher ist, aber einer, bei dem das Betriebssystem das Programm nicht wirklich zum Schreiben bringt, sondern stattdessen das Kern-Dumping oder das Programm anderweitig unterbricht.

    
Paul Keeble 14.08.2009 16:53
quelle
2
  

Wie sagt der Computer, dass die Referenz null statt einer Referenz auf ein Objekt enthält?

Laut Wikipedia kann der Nullzeiger in bestimmten Sprachen eine feste Adresse im Speicher sein, auf die Benutzerprogramme nicht zugreifen können, wenn also ein Objekt auf diese Adresse zeigt, ist es null, andernfalls nicht.

    
Dave M 14.08.2009 16:42
quelle
1

Die erste Seite des RAM ist normalerweise vor Benutzer-Space-Programmen geschützt. Auf diese Weise wird, wenn ein Programmierer vergisst, nach einem Nullzeiger zu suchen, das Programm zumindest einen Seitenfehler verursachen, wenn das Programm versucht, auf diesen Ort zuzugreifen.

Also, während [0x00000000] technisch ein realer Speicherort ist, können die meisten Programme nicht darauf zugreifen.

x86 Prozessoren haben dort eine spezielle Tabelle, wenn ich mich richtig erinnere.

    
Brad Gilbert 14.08.2009 18:42
quelle
0

Ссылка

Nullzeiger oder Nullreferenz Null ist ein spezieller Zeigerwert (oder eine andere Art von Objektreferenz), der verwendet wird, um anzuzeigen, dass ein Zeiger absichtlich nicht auf ein Objekt zeigt (oder sich darauf bezieht). Ein solcher Zeiger wird als Null-Zeiger bezeichnet. 1 Viele Implementierungen verwenden den Wert 0 (alle Bits) Null), um den Nullzeiger darzustellen, da dieser sich am unteren Rand des Adressraums der meisten CPUs befindet (obwohl einige Architekturen einen vorzeichenbehafteten Adressraum verwenden und den negativsten Wert verwenden). Viele Betriebssysteme erzeugen eine Ausnahme, wenn versucht wird, auf diese Speicheradresse zuzugreifen. Einige Sprachen verwenden eine andere Nomenklatur für einen solchen Zeiger, zB verwenden Pascal, Ruby und Lua nil 2 , Visual Basic verwendet Nothing und Python verwendet None. Fortran betrachtet NULL nicht als Konstante, sondern als eine Eigenschaft, die von der NULLIFY-Direktive gesetzt und von der ASSOCIATED-Funktion getestet werden kann. Aus wikipedia

    
Jason Pyeron 14.08.2009 16:45
quelle