size_t
est un type non signé. Il ne peut donc pas représenter de valeurs négatives (<0). Vous l'utilisez lorsque vous comptez quelque chose et que vous êtes sûr qu'il ne peut pas être négatif. Par exemple, strlen()
renvoie un size_t
car la longueur d'une chaîne doit être au moins égale à 0.
Dans votre exemple, si l'index de la boucle doit toujours être supérieur à 0, il peut être judicieux d'utiliser l'option suivante size_t
ou tout autre type de données non signées.
Lorsque vous utilisez un size_t
vous devez vous assurer que dans tous les contextes où il est utilisé, y compris en arithmétique, vous voulez des valeurs non négatives. Par exemple, disons que vous avez :
size_t s1 = strlen(str1);
size_t s2 = strlen(str2);
et vous voulez trouver la différence entre les longueurs de str2
y str1
. Vous ne pouvez pas le faire :
int diff = s2 - s1; /* bad */
Cela est dû au fait que la valeur attribuée à diff
sera toujours un nombre positif, même lorsque s2 < s1
car le calcul est effectué avec des types non signés. Dans ce cas, en fonction de votre utilisation, il est préférable d'utiliser la fonction int
(ou long long
) pour s1
y s2
.
Il y a certaines fonctions en C/POSIX qui pourraient/devraient utiliser size_t
mais ne le font pas pour des raisons historiques. Par exemple, le deuxième paramètre de fgets
devrait idéalement être size_t
mais c'est int
.
14 votes
Si ce sont vos seules options, utilisez
int
sisome_size
est signé,size_t
si elle est non signée.9 votes
@Nate C'est incorrect. POSIX a un type ssize_t mais le type correct à utiliser est ptrdiff_t.
5 votes
Les réponses ne sont pas aussi claires que dans Programmation de bas niveau : C, Assemblage et exécution de programmes sur Intel® 64 . Comme indiqué dans le livre, l'utilisation d'un index
int i
peut ne pas être suffisant pour traiter un énorme tableau. Ainsi, en utilisantsize_t i
vous pouvez adresser plus d'indices, donc même si vous avez un énorme tableau, cela ne devrait pas être un problème.size_t
est un type de données : généralement ununsigned long int
mais cela dépend de votre système.