A NULL a C és C++ programozási nyelvekben az stddef.h fejlécfájlban (és más fejlécfájlokban) deklarált makró . Ennek a makrónak az értéke egy megvalósítástól függő nullmutató állandó .
A null mutatókonstans egy egész szám konstans kifejezés 0 értékű vagy (csak C nyelven) ugyanazzal a kifejezéssel, amely típusba kerül void*. A nullmutató konstans bármely mutatótípusra leadott nullmutató . Garantált, hogy a nullmutató nem egyenlő egyetlen objektumra (a legtágabb értelemben bármilyen adatra) vagy funkcióra mutató mutatóval. Garantált, hogy bármely két nulla mutató egyenlő. A nullmutató hivatkozásának megszüntetése egy meghatározatlan viselkedésű művelet .
Más szóval, az implementáció egy speciális értéket ad - egy null mutató állandót, amely bármely mutatóhoz hozzárendelhető, és egy ilyen mutató összehasonlítva nem lesz egyenlő egyetlen "helyes" mutatóval sem. Vagyis feltételezhetjük, hogy a null mutató nem tartalmaz érvényes címet a memóriában.
A nulla mutatók kényelmes módja az olyan mutatók "megjelölésének", amelyekről ismert, hogy nem mutatnak érvényes memóriacímre. Például amikor egy mutatót automatikus változóként deklarálunk, az értéke nem definiálható. Megjegyezzük, hogy ez a mutató még nem tartalmaz érvényes címet a memóriában, az ilyen mutatóhoz null mutatókonstans van hozzárendelve:
void f ( érvénytelen ) { int * x = NULL ; /* ... */ }Jó programozási stílus, ha nullmutatót rendelünk egy mutatóhoz, miután felszabadította a hivatkozott memóriát. Ezenkívül a nullázási mutatók használata fontos a memória felszabadítása szempontjából: a törlési művelet C ++-ban ( C-ben szabad ) biztonságos nullmutató esetén. Például:
TÍPUS * foo = új TÍPUS (); //foo használata törlés foo ; // foo != NULL // valamilyen programkód törlése foo ; //HIBA! a memória már nem elérhetőmíg ebben a verzióban nem lesz hiba
TÍPUS * foo = új TÍPUS (); //foo használata törlés foo ; // foo != NULL foo = NULL ; // foo == NULL // valamilyen programkód törlése foo ; //nincs hiba: a delete ellenőrzi a foo értékétFüggvény hívásakor NULL adható át az egyik argumentumnak. A NULL makró különböző módon definiálható a különböző fordítóprogramokban, beleértve
#define NULL 0
#define NULL ((void *)0)
Az első esetben a NULL int, a második esetben pedig a void* típusú. Vannak olyan architektúrák, ahol sizeof(int) != sizeof(void*), akkor a különböző platformokon eltérő számú bájtot kap a függvény, ami megzavarhatja a működését. Jelenleg a nullptr bevezetésével próbálják megoldani ezt a problémát C-ben, lásd az N 2394 [1] javaslatot .
A nullmutató hivatkozásának megszüntetése egy meghatározatlan viselkedésű művelet . A megvalósításra nincsenek korlátozások : például előfordulhat olyan memória-hozzáférés, amelyet nem ennek a programnak szántak (vagyis olvasáskor a „szemét” beolvasásra kerül, és íráskor az érték a egy memóriaterület, amely nem tartozik a programhoz). Például DOS-ban a nulla címre írás legalább a nulla megszakítási vektort felülírja , így az int 0 következő hívása nagy valószínűséggel leállítja a rendszert. Ez azonban leggyakrabban futásidejű hibát eredményez (ha az operációs rendszer memóriavédelmet valósít meg, és a folyamat számára le van tiltva a hozzáférés a nem allokált memóriához). Például a Windows 9x rendszerben az „Általános védelmi hiba” - „A program illegális műveletet hajtott végre, és bezárják” ( angol általános védelmi hiba, GPF ) üzenet a leggyakrabban olyan esetekben jelenik meg, amikor a program helytelenül éri el a memóriát ( beleértve az inicializálatlan vagy már felszabadított) mutatót. Unix-szerű operációs rendszereken ilyen helyzetekben a folyamat SIGSEGV jelet kap, és a kezelője kiírja a " Segmentation fault " üzenetet.
Ha a NULL egy adott implementációját használja a forrásfájlokban, akkor az (void*)0 vagy 0 lehet. A NULL használata C++ projektekben hibákhoz vezethet. Például
int ( Osztálynév ::* pf )() = NULL ;fordítási hibát fog eredményezni, ha a NULL értéke (void*)0 (például egy fejléc közvetetten szerepel, ahol a NULL szabvány C++ definíciója átfedésben van). Ezért nem javasolt a NULL használata ((void *)0) formában a C++ programokban. A C++11 szabvány egy új nullptr kulcsszót ad hozzá [2] [3] a null pointer jelölésére .