Έχω μπερδευτεί με το size_t
στη C. Ξέρω ότι επιστρέφεται από τον τελεστή sizeof
. Αλλά τι ακριβώς είναι; Είναι ένας τύπος δεδομένων;
Ας πούμε ότι έχω έναν βρόχο "for":
for(i = 0; i < some_size; i++)
Πρέπει να χρησιμοποιήσω int i;
ή size_t i;
;
Σύμφωνα με το πρότυπο ISO C του 1999
(C99), το
size_t
είναι ένας ακέραιος χωρίς πρόσημο τύπου τουλάχιστον 16 bit (βλ. ενότητες 7.17 και 7.18.3). >,size_t
είναι ένας τύπος δεδομένων χωρίς πρόσημο που ορίζεται από διάφορα πρότυπα της C/C++, π.χ. το πρότυπο C99 ISO/IEC 9899, που ορίζεται στοstddef.h
.1 Μπορεί να να εισαχθεί περαιτέρω με τη συμπερίληψη τηςstdlib.h
καθώς αυτό το αρχείο υποκαθίσταται εσωτερικά. περιλαμβάνει τοstddef.h
. >, Αυτός ο τύπος χρησιμοποιείται για την αναπαράσταση των μέγεθος ενός αντικειμένου. Συναρτήσεις της βιβλιοθήκης που λαμβάνουν ή επιστρέφουν μεγέθη τα αναμένουν να είναι του τύπου ή να έχουν τον τύπο επιστροφής τουsize_t
. Επιπλέον, οι πιο που χρησιμοποιούνται συχνά με βάση τον μεταγλωττιστή τελεστής sizeof θα πρέπει να αποτιμάται σε ένα σταθερή τιμή που είναι συμβατή μεsize_t
.
Ως επακόλουθο, το size_t
είναι ένας τύπος που εγγυάται ότι μπορεί να κρατήσει οποιονδήποτε δείκτη πίνακα.
Το size_t
είναι ένας τύπος χωρίς πρόσημο. Επομένως, δεν μπορεί να αναπαραστήσει αρνητικές τιμές (<0). Τον χρησιμοποιείτε όταν μετράτε κάτι και είστε σίγουροι ότι δεν μπορεί να είναι αρνητικό. Για παράδειγμα, η strlen()
επιστρέφει ένα size_t
επειδή το μήκος μιας συμβολοσειράς πρέπει να είναι τουλάχιστον 0.
Στο παράδειγμά σας, αν ο δείκτης του βρόχου σας πρόκειται να είναι πάντα μεγαλύτερος από 0, μπορεί να έχει νόημα να χρησιμοποιήσετε size_t
, ή οποιονδήποτε άλλο μη προσημασμένο τύπο δεδομένων.
Όταν χρησιμοποιείτε ένα αντικείμενο size_t
, πρέπει να βεβαιωθείτε ότι σε όλα τα πλαίσια που χρησιμοποιείται, συμπεριλαμβανομένης της αριθμητικής, θέλετε μη αρνητικές τιμές. Για παράδειγμα, ας υποθέσουμε ότι έχετε:
size_t s1 = strlen(str1);
size_t s2 = strlen(str2);
και θέλετε να βρείτε τη διαφορά των μηκών των str2
και str1
. Δεν μπορείτε να κάνετε:
int diff = s2 - s1; /* bad */
Αυτό συμβαίνει επειδή η τιμή που ανατίθεται στο diff
θα είναι πάντα θετικός αριθμός, ακόμα και όταν s2 < s1
, επειδή ο υπολογισμός γίνεται με τύπους χωρίς πρόσημο. Σε αυτή την περίπτωση, ανάλογα με την περίπτωση χρήσης σας, ίσως είναι καλύτερα να χρησιμοποιήσετε int
(ή long long
) για τα s1
και s2
.
Υπάρχουν ορισμένες συναρτήσεις στη C/POSIX που θα μπορούσαν/θα έπρεπε να χρησιμοποιούν το size_t
, αλλά δεν το κάνουν για ιστορικούς λόγους. Για παράδειγμα, η δεύτερη παράμετρος της fgets
θα έπρεπε ιδανικά να είναι size_t
, αλλά είναι int
.