V C je NULL simbolna konstanta, ki vedno kaže na neobstoječo točko v spominu. Čeprav ga mnogi programerji obravnavajo kot 0, je to poenostavitev, ki vas lahko kasneje spotakne. Najbolje je, da svoje kazalce neposredno preverite glede na NULL in uporabite 0 v drugih kontekstih. Tako bo vaša koda čista in enostavna za razumevanje, saj boste vedeli, da delate s kazalci vsakič, ko vidite NULL.
Koraki
1. del od 2: Izvajanje ničelne kontrole
Korak 1. Uporabite standardno ničelno kodo za preverjanje
Sledi najbolj očiten način za zapis ničelnega čeka. Uporabili bomo ptr v tem članku kot ime kazalca, ki ga preverjate.
-
če (ptr == NULL)
{
// kodira, če je kazalec NULL
} drugo {
// koda, če ni NULL
}
Korak 2. Preizkusite katero koli vrednost, razen NULL
Včasih je primerneje namesto tega preizkusiti neenakost. Tu ni presenečenj:
-
if (ptr! = NULL) {
// koda, če ni NULL
}
Korak 3. Najprej napišite NULL, da se izognete napakam (neobvezno)
Glavna pomanjkljivost metode PTR == NULL je možnost, da po nesreči vnesete ptr = NULL in temu kazalcu dodelite vrednost NULL. To lahko povzroči močan glavobol. Ker testiranje (ne) enakosti obravnava operande simetrično, lahko s pisanjem dobite popolnoma enak rezultat če (NULL == ptr) namesto tega. To je bolj odporno na tipkarske napake, saj naključni NULL = ptr povzroči preprosto napako pri prevajanju.
Nekaterim programerjem se to zdi nekoliko nerodno, vendar je povsem veljavno. Kateri pristop boste uporabili, je odvisno samo od osebnih želja in od tega, kako uspešen je vaš prevajalnik pri odkrivanju napake if (ptr = NULL)
Korak 4. Preverite, ali je spremenljivka res
Preprosto če (ptr) preveri, ali je ptr res. Vrnilo se bo FALSE, če je ptr NULL ali če je ptr 0. Razlikovanje v mnogih primerih ni pomembno, vendar se zavedajte, da niso enaki v vseh arhitekturah.
Obratno od tega je če (! ptr), ki bo vrnilo TRUE, če je ptr FALSE.
2. del 2: Izogibanje napakam
Korak 1. Pred preverjanjem NULL nastavite kazalec
Ena pogosta napaka je domneva, da ima novo ustvarjeni kazalec vrednost NULL. To ni res. Nedodeljeni kazalec še vedno kaže na pomnilniški naslov, samo ne na tistega, ki ste ga določili. Običajna praksa je, da novonastale ali na novo sproščene kazalce nastavite na NULL, da zagotovite, da ne boste pomotoma uporabili tega neuporabnega naslova.
-
Izogibajte se tej napaki:
char *ptr;
če (ptr == NULL)
{
// To bo vrnilo FALSE. Kazalcu je bila dodeljena veljavna vrednost.
}
-
Namesto tega napišite:
char *ptr = NULL; // S tem se kazalec dodeli NULL
če (ptr == NULL)
{
// Če kazalec ni bil dodeljen, se vrne TRUE.
}
Korak 2. Bodite pozorni na funkcije, ki bi lahko vrnile NULL
Če lahko funkcija vrne NULL, razmislite, ali je to možnost in ali bi to kasneje v vaši kodi povzročilo težave. Tukaj je primer funkcije malloc s preverjanjem ničelnosti (če (ptr)), da zagotovite, da obravnava samo kazalce z veljavnimi vrednostmi:
-
int * ptr = malloc (N * sizeof (int));
if (ptr) {
int i;
za (i = 0; i <N; ++ i)
ptr = i;
}
Korak 3. Zavedajte se, da je NULL 0, vendar za jasnost pri delu s kazalci vedno uporabite NULL namesto 0
V preteklosti je C predstavljal NULL kot številko 0 (to je 0x00). Danes je lahko nekoliko bolj zapleteno in se razlikuje glede na operacijski sistem. Običajno lahko z NULL preverite NULL ptr == 0, vendar obstajajo vogalni primeri, ko lahko to povzroči težavo. Morda je še pomembneje, da uporaba NULL pokaže, da delate s kazalci za druge ljudi, ki berejo vašo kodo.