1. Mis on NULL keeles C?
C keeles on NULL
väga oluline mõiste, mis tähistab spetsiaalset konstantset väärtust, mis näitab, et pointer osutab kehtetule mäluaadressile. Tavaliselt osutab pointer mingile kindlale mäluaadressile, kuid kui see ei osuta kuhugi, määratakse pointerile väärtus NULL
. See on oluline samm programmi stabiilsuse tagamiseks ja valede mälupöördumiste vältimiseks.
NULL-i definitsioon
NULL
on defineeritud päisefailis <stddef.h>
ning see vastab täisarvule 0. Näiteks saab pointerit NULL-iga initsialiseerida järgmiselt.
#include <stddef.h>
int *ptr = NULL;
See näitab selgelt, et pointer ei osuta ühtegi kehtetut mäluaadressi. Kui mälu eraldamine ebaõnnestub, tagastatakse NULL
, mida kasutatakse vea kontrollimiseks.
NULL ja teised spetsiaalsed väärtused
Sageli aetakse NULL segamini täisarvu 0 või stringi lõppu tähistava märgiga ‘\0’. Igaühel neist on erinev funktsioon, seega tuleb olla tähelepanelik.
- NULL: tähistab kehtetut pointerit.
- 0: täisarvuna null.
- ‘\0’: stringi lõpumärk ehk null-märk.
Nende erinevuste mõistmine ja korrektne kasutamine aitab vältida programmi vigu.
2. NULL-pointeri tähtsus
C keeles võimaldavad pointerid otsest mäluaadresside käsitlemist, kuid sellega kaasneb ka risk. Kui pointer osutab kehtetule aadressile, võib programm kokku joosta. Seetõttu on oluline pointer alati NULL
-iga initsialiseerida.
Initsialiseerimine NULL-iga
Initsialiseerimata pointer võib osutada suvalisse kohta mälus (dangling pointer), mis on ohtlik olukord. Selle vältimiseks on soovitatav alati initsialiseerida pointer väärtusega NULL.
int *ptr = NULL;
Selline pointer näitab selgelt, et seda pole veel kasutatud ning aitab vältida valesid mälupöördumisi.
Turvaline NULL-kontroll
Enne pointeri kasutamist on oluline kontrollida, kas selle väärtus on NULL. See aitab vältida kehtetuid mälupöördumisi ja tagab programmi ohutu töö.
if (ptr != NULL) {
*ptr = 100;
}
Süsteemne NULL-kontroll võimaldab lihtsalt veenduda pointeri kehtivuses ja vältida ootamatuid krahhe.
3. Praktiline: Mälu haldamine NULL-iga
C keeles kasutatakse dünaamiliseks mälu haldamiseks malloc
ja calloc
funktsioone. Kui mälu eraldamine ebaõnnestub, tagastavad need NULL
. Sellistel juhtudel võimaldab NULL-kontroll teostada korrektset veakäsitlust.
Näide mälu eraldamisest
Järgmises näites kasutatakse malloc
-i ning kontrollitakse, kas mälu eraldamine õnnestus.
int *ptr = (int *)malloc(sizeof(int));
if (ptr == NULL) {
printf("Mälu eraldamine ebaõnnestus.\n");
} else {
*ptr = 100;
printf("Mällu määrati väärtus %d.\n", *ptr);
}
Kui mälu eraldamine ebaõnnestub, tagastatakse NULL
ning käivitatakse veahaldus. Õige NULL-kontroll parandab programmi turvalisust.
Pointeri seadistamine NULL-iks pärast vabastamist
Pärast dünaamilise mälu kasutamist on soovitatav kasutada free
-funktsiooni ja seejärel seada pointer väärtusele NULL. See hoiab ära pointeri eksliku kasutamise pärast mälu vabastamist.
free(ptr);
ptr = NULL;
Selle harjumuse kujundamine aitab vältida dangling pointer’it, mälu lekkimist ja ootamatuid programmeerimisvigu.

4. NULL-kontrolli näidisrakendus
NULL-kontroll on C keeles turvalise programmeerimise põhiline tehnika. Järgmisena on toodud näide funktsioonist, mis kontrollib NULL-i olemasolu.
int isNull(int *ptr) {
return ptr == NULL;
}
int main() {
int *ptr = NULL;
if (isNull(ptr)) {
printf("Pointer on null.\n");
} else {
printf("Pointer on kehtiv.\n");
}
return 0;
}
Selle isNull
-funktsiooni abil saab lihtsalt kontrollida, kas pointer on NULL. Selliste funktsioonide kasutamine parandab programmi loetavust ja hooldatavust.
5. NULL-i kasutamise tähelepanekud
NULL-i kasutamisel tuleb olla tähelepanelik. Eriti oluline on mitte ajada NULL-i segamini teiste spetsiaalsete väärtustega nagu 0 või ‘\0’. Need sarnanevad, kuid neil on erinevad kasutusotstarbed.
NULL, 0 ja ‘NULL, 0 ja ‘\0’ erinevused
’ erinevused
- NULL: pointer, mis osutab kehtetule mäluaadressile.
- 0: arvväärtus nullina.
- ‘\0’: stringi lõppu tähistav null-märk.
Õigete erinevuste mõistmine aitab vältida programmeerimisvigu. Lisaks on NULL-i kasutamisel oluline korralik mäluhaldus ja veakontroll.