C: ssä NULL on symbolinen vakio, joka viittaa aina muistin olemattomaan pisteeseen. Vaikka monet ohjelmoijat pitävät sitä yhtä suurena kuin 0, tämä on yksinkertaistus, joka voi laukaista sinut myöhemmin. On parasta tarkistaa osoittimesi suoraan NULL: ää vastaan ja käyttää 0 muissa yhteyksissä. Tämä pitää koodisi puhtaana ja helposti ymmärrettävänä, koska tiedät, että käytät viitteitä joka kerta, kun näet NULL.
Askeleet
Osa 1/2: Nollaustarkistuksen suorittaminen
Vaihe 1. Käytä normaalia nollatarkistuskoodia
Seuraava on ilmeisin tapa kirjoittaa nollatarkistus. Me käytämme ptr tässä artikkelissa tarkistamasi osoittimen nimenä.
-
jos (ptr == NULL)
{
// koodi, jos osoitin on NULL
} muuta {
// koodi, jos ei NULL
}
Vaihe 2. Testaa mikä tahansa muu arvo kuin NULL
Joskus on helpompaa testata eriarvoisuutta. Ei yllätyksiä täällä:
-
jos (ptr! = NULL) {
// koodi, jos ei NULL
}
Vaihe 3. Kirjoita ensin NULL virheiden välttämiseksi (valinnainen)
Suurin haitta PTR == NULL -menetelmässä on mahdollisuus, että kirjoitat vahingossa ptr = NULL ja määrität NULL -arvon kyseiselle osoittimelle. Tämä voi aiheuttaa suuren päänsäryn. Koska (epä) tasa -arvon testaus käsittelee operandit symmetrisesti, voit saada täsmälleen saman tuloksen kirjoittamalla jos (NULL == ptr) sen sijaan. Tämä on kirjoitusvirheitä kestävämpi, koska vahingossa NULL = ptr luo yksinkertaisen kääntämisvirheen.
Tämä näyttää joillekin ohjelmoijille hieman hankalalta, mutta se on täysin pätevä. Käytettävä lähestymistapa riippuu vain henkilökohtaisista mieltymyksistä ja siitä, kuinka hyvä kääntäjäsi havaitsee if (ptr = NULL) -virheen
Vaihe 4. Testaa, onko muuttuja tosi
Yksinkertainen jos (ptr) testaa onko ptr TOSI. Se palauttaa EPÄTOSI, jos ptr on NULL tai jos ptr on 0. Erotuksella ei ole väliä monissa tapauksissa, mutta muista, että ne eivät ole identtisiä kaikissa arkkitehtuureissa.
Tämä on päinvastoin jos (! ptr), joka palauttaa TOSI, jos ptr on EPÄTOSI.
Osa 2/2: Virheiden välttäminen
Vaihe 1. Aseta osoitin ennen NULL -tarkistusta
Yksi yleinen virhe on olettaa, että äskettäin luodulla osoittimella on NULL -arvo. Tämä ei ole totta. Määrittämätön osoitin osoittaa edelleen muistiosoitetta, ei vain määrittämääsi osoitetta. On yleinen käytäntö asettaa äskettäin luodut tai juuri vapautetut osoittimet NULL -asetukseksi varmistaaksesi, että et käytä tätä hyödytöntä osoitetta vahingossa.
-
Vältä tätä virhettä:
char *ptr;
jos (ptr == NULL)
{
// Tämä palauttaa EPÄTOSI. Osoittimelle on annettu kelvollinen arvo.
}
-
Kirjoita sen sijaan:
char *ptr = NULL; // Tämä määrittää osoittimen arvoon NULL
jos (ptr == NULL)
{
// Tämä palauttaa arvon TOSI, jos osoitinta ei ole määritetty uudelleen.
}
Vaihe 2. Kiinnitä huomiota toimintoihin, jotka voivat palauttaa NULL -arvon
Jos funktio voi palauttaa NULL -arvon, mieti, onko tämä mahdollista ja aiheuttaako se myöhemmin ongelmia koodissasi. Tässä on esimerkki malloc -toiminnosta, joka käyttää nollatarkistusta (jos (ptr)) varmistaakseen, että se käsittelee vain kelvollisten arvojen osoittimia:
-
int * ptr = malloc (N * sizeof (int));
jos (ptr) {
int i;
(i = 0; i <N; ++ i)
ptr = i;
}
Vaihe 3. Ymmärrä, että NULL on 0, mutta sinun on aina käytettävä NULL: ää 0: n sijaan, kun työskentelet osoittimien kanssa selkeyden vuoksi
Historiallisesti C edusti NULLia numerona 0 (eli 0x00). Nykyään se voi muuttua hieman monimutkaisemmaksi ja vaihtelee käyttöjärjestelmän mukaan. Voit yleensä tarkistaa NULL -arvon käyttämällä ptr == 0, mutta on kulmitapauksia, joissa tämä voi aiheuttaa ongelmia. Ehkä vielä tärkeämpää on, että NULL: n käyttäminen tekee selväksi, että käytät osoittimia muille koodisi lukijoille.