Wartość wskaźnika zerowego reprezentuje dobrze zdefiniowane „nigdzie”; jest to niepoprawna wartość wskaźnika, która gwarantuje porównanie nierówne z dowolną inną wartością wskaźnika. Próba wyrejestrowania wskaźnika zerowego powoduje niezdefiniowane zachowanie i zwykle prowadzi do błędu środowiska wykonawczego, dlatego przed upewnieniem się, że wskaźnik nie ma wartości NULL, należy upewnić się, że wskaźnik nie ma wartości NULL. Szereg funkcji bibliotecznych C i C ++ zwróci wskaźnik zerowy wskazujący warunek błędu. Na przykład funkcja biblioteczna malloc
zwróci wartość wskaźnika zerowego, jeśli nie będzie mogła przydzielić żądanej liczby bajtów, a próba uzyskania dostępu do pamięci przez ten wskaźnik (zwykle) doprowadzi do błędu w czasie wykonywania:
int *p = malloc(sizeof *p * N);
p[0] = ...; // this will (usually) blow up if malloc returned NULL
Musimy więc upewnić się, że malloc
wywołanie zakończyło się powodzeniem, sprawdzając wartość p
przeciw NULL:
int *p = malloc(sizeof *p * N);
if (p != NULL) // or just if (p)
p[0] = ...;
A teraz poczekaj chwilę na skarpetkach, to będzie trochę wyboiste.
Istnieje wskaźnik NULL wartość i null pointer stałe , a dwa nie zawsze są takie same. Null pointer wartość jest niezależnie od wartości leżących u podstaw architektury zastosowania do reprezentowania „nigdzie”. Ta wartość może wynosić 0x00000000 lub 0xFFFFFFFF, 0xDEADBEEF lub coś zupełnie innego. Nie należy zakładać, że wskaźnik zerowa wartość jest zawsze 0.
Stała wskaźnika zerowego , OTOH, jest zawsze wyrażeniem całkowitym o wartości 0. Jeśli chodzi o kod źródłowy , 0 (lub dowolne wyrażenie całkowite, którego wynikiem jest 0), oznacza wskaźnik zerowy. Zarówno C, jak i C ++ definiują makro NULL jako stałą wskaźnika zerowego. Gdy kod zostanie skompilowany, null pointer stałe zostaną zastąpione odpowiednim zerowy wskaźnik wartości w wygenerowanego kodu maszynowego.
Pamiętaj również, że NULL jest tylko jedną z wielu możliwych nieprawidłowych wartości wskaźnika; jeśli zadeklarujesz zmienną wskaźnika automatycznego bez jawnej jej inicjalizacji, np
int *p;
wartość początkowo przechowywana w zmiennej jest nieokreślona i może nie odpowiadać prawidłowemu lub dostępnemu adresowi pamięci. Niestety, nie ma (przenośnego) sposobu, aby stwierdzić, czy wartość wskaźnika inna niż NULL jest poprawna, czy nie przed próbą jej użycia. Więc jeśli masz do czynienia ze wskaźnikami, zwykle dobrym pomysłem jest jawne zainicjowanie ich na NULL, kiedy je deklarujesz, i ustawienie ich na NULL, gdy nie wskazują na nic aktywnie.
Zauważ, że jest to bardziej problem w C niż w C ++; idiomatic C ++ nie powinien zbyt często używać wskaźników.