Der Nullzeigerwert repräsentiert ein wohldefiniertes "Nirgendwo". Es handelt sich um einen ungültigen Zeigerwert, der garantiert mit keinem anderen Zeigerwert verglichen werden kann. Der Versuch, einen Nullzeiger zu dereferenzieren, führt zu undefiniertem Verhalten und führt normalerweise zu einem Laufzeitfehler. Stellen Sie daher sicher, dass ein Zeiger nicht NULL ist, bevor Sie ihn dereferenzieren. Eine Reihe von C- und C ++ - Bibliotheksfunktionen geben einen Nullzeiger zurück, um einen Fehlerzustand anzuzeigen. Beispielsweise gibt die Bibliotheksfunktion malloc
einen Nullzeigerwert zurück, wenn sie die Anzahl der angeforderten Bytes nicht zuordnen kann, und der Versuch, über diesen Zeiger auf den Speicher zuzugreifen, führt (normalerweise) zu einem Laufzeitfehler:
int *p = malloc(sizeof *p * N);
p[0] = ...; // this will (usually) blow up if malloc returned NULL
Wir müssen also sicherstellen, dass der malloc
Aufruf erfolgreich war, indem wir den Wert von p
gegen NULL prüfen :
int *p = malloc(sizeof *p * N);
if (p != NULL) // or just if (p)
p[0] = ...;
Bleib eine Minute bei deinen Socken, das wird ein bisschen holprig.
Es gibt einen Nullzeiger - Wert und eine Null - Zeiger - Konstante , und die beiden sind nicht notwendigerweise gleich. Der Null - Zeiger - Wert ist , was die zugrunde liegende Architektur Nutzungen schätzen „nirgendwo“ darzustellen. Dieser Wert kann 0x00000000 oder 0xFFFFFFFF oder 0xDEADBEEF oder etwas völlig anderes sein. Gehen Sie nicht davon , dass der Null - Zeiger - Wert ist immer 0.
Der Nullzeiger Konstante OTOH ist immer ein ganzzahliger Ausdruck mit dem Wert 0. Für Ihren Quellcode steht 0 (oder ein ganzzahliger Ausdruck, der mit 0 bewertet wird) für einen Nullzeiger. Sowohl C als auch C ++ definieren das NULL-Makro als Nullzeiger-Konstante. Wenn Ihr Code kompiliert wird, wird die Nullzeiger- Konstante durch den entsprechenden Nullzeiger- Wert im generierten Maschinencode ersetzt.
Beachten Sie außerdem, dass NULL nur einer von vielen möglichen ungültigen Zeigerwerten ist. Wenn Sie eine Auto-Pointer-Variable deklarieren, ohne sie explizit zu initialisieren, wie z
int *p;
Der ursprünglich in der Variablen gespeicherte Wert ist unbestimmt und entspricht möglicherweise nicht einer gültigen oder zugänglichen Speicheradresse. Leider gibt es keine (portable) Möglichkeit, festzustellen, ob ein Zeigerwert ungleich NULL gültig ist oder nicht, bevor Sie versuchen, ihn zu verwenden. Wenn Sie es also mit Zeigern zu tun haben, ist es normalerweise eine gute Idee, sie explizit auf NULL zu initialisieren, wenn Sie sie deklarieren, und sie auf NULL zu setzen, wenn sie nicht aktiv auf irgendetwas zeigen.
Beachten Sie, dass dies in C eher ein Problem ist als in C ++. idiomatisches C ++ sollte nicht allzu oft Zeiger verwenden.