Δημοσιεύτηκε: 24 Μαρ 2012, 15:44
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 περιεχόμενα του δείκτη (όπου δηλαδή δείχνει ο μη-αρχικοποιημένος δείκτης).