Null-Pointer
Adressen des Speichers können als vorzeichenlose Ganzzahlen aufgefasst werden, welche in Pointern gespeichert werden. Die Adresse 0 (Null) ist somit genauso wie jede andere Ganzzahl eine potentiell gültige Adresse. Allerdings ist diese Adresse in modernen Systemen für die Speicherverwaltung reserviert, und ein Zugriff auf diese Adresse führt aufgrund verschiedener Sicherheitsmassnahmen zu einem Absturz des Programmes. Die Adresse Null wird jedoch häufig verwendet, um einen Pointer als uninitialisiert
zu deklarieren.
Details
Pointer-Variablen werden oftmals direkt bei der Definition mit einer gültigen Adresse initialisiert. Diese Initialisierung ist jedoch nicht in jedem Falle möglich und wird auch nicht automatisch ausgeführt. So kann es sein, dass sich in einer nicht-initialisierten Pointer-Variablen ein Wert befindet, welcher eine ungültige Adresse beschreibt. Bei einem Zugriff auf diese Adresse würde das Programm möglicherweise abstürzen.
Beispielsweise werden Pointer-Variablen verwendet, um dynamisch alloziierte Speicherblöcke (siehe new-Operator) zu speichern. Wann genau während des Programmablaufes eine solche Allokation stattfindet, ist dem Programmierer überlassen. Zur Kennzeichnung des Pointers, ob er eine gültige Adresse beinhaltet oder nicht, wird der Null-Pointer verwendet. Der Wert Null hat somit die semantische Bedeutung, dass der Pointer auf keine gültige Adresse zeigt.
Durch diese Festlegung kann ein Pointer auch als boolscher Wert aufgefasst werden, welcher false ergibt, wenn der Pointer Null ist und true in jedem anderen Falle. Diese Eigenschaft wird sehr häufig bei Bedingungen von Kontrollstrukturen verwendet. Beispielsweise wird im folgenden Code geprüft, ob die Allokation erfolgreich war:
|
|
In diesem Beispiel war die Allokation von b nicht erfolgreich, da zuwenig Speicher vorhanden war. Es ist zu beachten, dass die free-Funktion (genauso wie der delete-Operator) explizit auch einen Null-Pointer annimmt, ohne dass ein Fehler auftritt.
Nach wie vor ist es nicht standartisiert, wie ein Pointer mit dem Wert Null belegt wird. In verschiedenen Codes können verschiedene Angaben auftreten. Einige davon sind hier aufgeführt:
NULL | Nur verfügbar duch Einbinden von Standardbibliotheken (normalerweise in stdio.h). Wird normalerweise als integer-Wert 0 definiert. |
0 | Funktioniert, sieht aber nicht schön aus. |
nullptr | Der Standard, der angeblich in der nächsten ISO-Norm von C++ eingeführt werden soll und explizit nur für Pointer gültig ist. |
NIL, Nil, nil, Null, null, zero | Nicht empfehlenswert, wird in anderen Sprachen verwendet. |
Die Empfehlung des Autors ist, den Wert NULL durch Einbinden der entsprechenden Standardbibliothek zu verwenden.