NULL (C)

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.

Használja

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ét

A mutató méretei

Fü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 .

Null mutatók hivatkozásának megszüntetése

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.

Null mutatók C++-ban

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 .

Lásd még

Jegyzetek

  1. N  2394_  _ . Nyílt szabványok . Letöltve: 2020. május 22. Az eredetiből archiválva : 2020. július 27.
  2. JTC1/SC22/WG21 – A C++ Szabványügyi Bizottság. SC22/WG21/N2431 = J16/07-0301 "A nullmutató neve: nullptr"  (angol) (PDF)  (hivatkozás nem érhető el) . JTC1.22.32 . A C++ Szabványügyi Bizottság (2007. október 2.). Hozzáférés dátuma: 2010. október 4. Az eredetiből archiválva : 2012. február 11.  (Angol)
  3. Scott Meyers , Összefoglaló a C++11 szolgáltatás elérhetőségéről a gcc-ben és az MSVC -ben Archiválva : 2011. október 26. a Wayback Machine -nél , 2011. augusztus 16.

Linkek