Mi sto confondendo con size_t
in C. So che viene restituito dall'operatore sizeof
. Ma cos'è esattamente? È un tipo di dati?
Diciamo che ho un ciclo for
:
for(i = 0; i < some_size; i++)
Devo usare int i;
o size_t i;
?
Secondo lo standard ISO C del 1999
(C99), size_t
è un intero senza segno
di almeno 16 bit (vedere le sezioni
7.17 e 7.18.3).
size_t
è un tipo di dati senza segno definito da diversi standard C/C++, per esempio lo standard C99 ISO/IEC 9899, che è definito instddef.h
.1 Può essere ulteriormente importato tramite l'inclusione distdlib.h
come questo file internamente sub includestddef.h
.Questo tipo è usato per rappresentare la dimensione di un oggetto. Le funzioni di libreria che prendono o restituiscono dimensioni si aspettano che esse essere di tipo o avere il tipo di ritorno di
size_t
. Inoltre, il più frequentemente usato dal compilatore operatore sizeof dovrebbe valutare ad un valore costante che è compatibile consize_t
.
Come implicazione, size_t
è un tipo garantito per contenere qualsiasi indice di array.
size_t
è un tipo senza segno. Quindi, non può rappresentare alcun valore negativo (<0). Lo usate quando state contando qualcosa e siete sicuri che non può essere negativo. Per esempio, strlen()
restituisce una size_t
perché la lunghezza di una stringa deve essere almeno 0.
Nel vostro esempio, se l'indice del vostro ciclo sarà sempre maggiore di 0, potrebbe avere senso usare size_t
, o qualsiasi altro tipo di dato senza segno.
Quando usi un oggetto size_t
, devi assicurarti che in tutti i contesti in cui viene usato, inclusa l'aritmetica, tu voglia valori non negativi. Per esempio, diciamo che avete:
size_t s1 = strlen(str1);
size_t s2 = strlen(str2);
e volete trovare la differenza delle lunghezze di str2
e str1
. Non potete fare:
int diff = s2 - s1; /* bad */
Questo perché il valore assegnato a diff
sarà sempre un numero positivo, anche quando s2 < s1
, perché il calcolo è fatto con tipi senza segno. In questo caso, a seconda di quale sia il tuo caso d'uso, potrebbe essere meglio usare int
(o long long
) per s1
e s2
.
Ci sono alcune funzioni in C/POSIX che potrebbero/dovrebbero usare size_t
, ma non lo fanno per ragioni storiche. Per esempio, il secondo parametro di fgets
dovrebbe idealmente essere size_t
, ma è int
.