Δημοσιεύτηκε: 24 Μαρ 2012, 15:44
από migf1
Ilias95 έγραψε:Ναι. Βέβαια για το NULL macro ακόμα δεν ξέρω πολλά πολλά, παρά μόνο ότι είναι το τελευταίο στοιχείο της *argv[].
Ο King κάνει αναφορά σε αυτό σε επόμενα κεφάλαια...

Το NULL στη C υλοποιείται συνήθως ως ένα απλό...
Μορφοποιημένος Κώδικας: Επιλογή όλων
#define (void *)0
ή ως...
Μορφοποιημένος Κώδικας: Επιλογή όλων
#define 0L

και χρησιμοποιείται στους δείκτες για να σηματοδοτήσει πως έχουν μια άκυρη μεν, γνωστή δε τιμή (το κενό). Ένα παράδειγμα είναι ο ορισμός ενός δείκτη, που μπορεί να γίνει με ή χωρίς αρχικοποίηση...

Μορφοποιημένος Κώδικας: Επιλογή όλων
char *cp;    /* χωρίς αρχικοποίηση, δείχνει σε undefined σημείο της μνήμης */
char *cp = NULL; /* με αρχικοποίηση, δείχνει στο γνωστό μας "κενό" */

Και στις 2 περιπτώσεις ο δείκτης δεν έχει περιεχόμενα (δεν τον έχουμε βάλει να δείχνει στη διεύθυνση κάποιας μεταβλητής, ή κάποιας άλλης γνωστής σε μας περιοχής της μνήμης) αλλά επειδή τον έχουμε αρχικοποιήσει σε NULL, μπορούμε με ασφάλεια να τσεκάρουμε αν έχει κενό περιεχόμενο ή όχι....

Μορφοποιημένος Κώδικας: Επιλογή όλων
if ( cp )...      // ή if (NULL != cp )

ή το πιο σύνηθες...

Μορφοποιημένος Κώδικας: Επιλογή όλων
if ( !cp )...      // ή if (NULL == cp )


Αν δεν τον έχουμε αρχικοποιήσει σε NULL, τότε οποιαδήποτε από τις παραπάνω συγκρίσεις εκτός από το ότι είναι αναξιόπιστη, πιθανότατα θα προκαλέσει και seg-fault, γιατί προσπαθούμε να χρησιμοποιήσουμε (συγκρίνουμε με NULL) undefined περιεχόμενα του δείκτη (όπου δηλαδή δείχνει ο μη-αρχικοποιημένος δείκτης).