NULL v programovacích jazycích C a C++ je makro deklarované v hlavičkovém souboru stddef.h (a dalších hlavičkových souborech). Hodnota tohoto makra je konstanta nulového ukazatele závislá na implementaci .
Nulová ukazatelová konstanta je celočíselný konstantní výraz s hodnotou 0 nebo (pouze v C) stejný výraz přetypovaný na typ void*. Konstanta nulového ukazatele na libovolný typ ukazatele je nulový ukazatel . Je zaručeno, že nulový ukazatel se nerovná ukazateli na žádný objekt (v nejširším slova smyslu žádná data) nebo funkci. Je zaručeno, že jakékoli dva nulové ukazatele jsou stejné. Dereferencování nulového ukazatele je operace s nedefinovaným chováním .
Jinými slovy, implementace poskytuje speciální hodnotu – nulovou konstantu ukazatele, kterou lze přiřadit libovolnému ukazateli a takový ukazatel se při srovnání nebude rovnat žádnému „správnému“ ukazateli. To znamená, že můžeme předpokládat, že nulový ukazatel neobsahuje platnou adresu v paměti.
Nulové ukazatele jsou navrženy jako pohodlný způsob, jak "označit" ukazatele, o kterých není známo, že by ukazovaly na platnou adresu paměti. Například při deklaraci ukazatele jako automatické proměnné není jeho hodnota definována. Abychom si všimli, že tento ukazatel ještě neobsahuje platnou adresu v paměti, je tomuto ukazateli přiřazena konstanta nulového ukazatele:
void f ( void ) { int * x = NULL ; /* ... */ }Je dobrým programovacím stylem přiřadit ukazateli nulový ukazatel po uvolnění paměti, na kterou odkazuje. Kromě toho je použití nulovacích ukazatelů důležité pro bezpečnost uvolňování paměti: operace mazání v C++ ( volná v C) je bezpečná pro nulový ukazatel. Například:
TYP * foo = nový TYP (); //použij foo delete foo ; // foo != NULL // nějaký programový kód smazat foo ; //CHYBA! paměť již není k dispozicizatímco v této verzi nebude žádná chyba
TYP * foo = nový TYP (); //použij foo delete foo ; // foo != NULL foo = NULL ; // foo == NULL // nějaký programový kód smazat foo ; //žádná chyba: delete zkontroluje hodnotu fooPři volání funkce lze jednomu z argumentů předat hodnotu NULL. Makro NULL může být definováno různými způsoby v různých kompilátorech, včetně
#define NULL 0
#define NULL ((void *)0)
V prvním případě je NULL typu int a ve druhém případě je typu void*. Existují architektury, kde sizeof(int) != sizeof(void*), pak na různých platformách funkce obdrží různý počet bajtů, což může narušit její činnost. V současné době probíhá pokus o vyřešení tohoto problému v C zavedením nullptr, viz návrh N 2394 [1] .
Dereferencování nulového ukazatele je operace s nedefinovaným chováním . Na implementaci nejsou uvalena žádná omezení : například může dojít k přístupu do paměti, která není určena pro použití tímto programem (to znamená, že při čtení se bude číst „smetí“ a při zápisu bude hodnota zapsána do oblast paměti, která nepatří do programu). Například v DOSu zápis na adresu nula přepíše alespoň nulový vektor přerušení , takže další volání int 0 s největší pravděpodobností zablokuje systém. To však nejčastěji vede k chybě běhu (pokud operační systém implementuje ochranu paměti a přístup k nepřidělené paměti pro proces je blokován). Například ve Windows 9x se hláška „Chyba obecné ochrany“ - „Program provedl neplatnou operaci a bude ukončen“ ( anglicky general protection fault, GPF ) vydává nejčastěji v případech, kdy program přistupuje k paměti podle nesprávného ( včetně neinicializovaného nebo již uvolněného) ukazatele. Na operačních systémech typu Unix v takových situacích proces přijme signál SIGSEGV a jeho obsluha vypíše zprávu „ Segmentation fault “.
Pokud vezmete konkrétní implementaci NULL ve zdrojových souborech, pak může být definována jako (void*)0 nebo jako 0. Použití NULL v projektech C++ může vést k chybám. Například
int ( Název třídy ::* pf )() = NULL ;bude mít za následek chybu kompilace, pokud je NULL definována jako (void*)0 (například záhlaví bylo nepřímo zahrnuto tam, kde se standardní definice NULL v C++ překrývá). Proto se nedoporučuje používat NULL ve tvaru ((void *)0) v programech C++. Standard C++11 přidává nové klíčové slovo nullptr [2] [3] pro označení nulového ukazatele .