748 votes

Qu'est-ce que size_t en C ?

Je m'embrouille avec size_t en C. Je sais qu'il est renvoyé par la fonction sizeof opérateur. Mais qu'est-ce que c'est exactement ? Est-ce un type de données ?

Disons que j'ai un for boucle :

for(i = 0; i < some_size; i++)

Dois-je utiliser int i; o size_t i; ?

14 votes

Si ce sont vos seules options, utilisez int si some_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 utilisant size_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 un unsigned long int mais cela dépend de votre système.

529voto

sblom Points 15074

De Wikipedia :

Selon la norme ISO C de 1999 (C99), size_t est un nombre entier non signé d'au moins 16 bits (voir les sections 7.17 et 7.18.3).

size_t est un type de données non signées défini par plusieurs normes C/C++, par exemple, la norme C99 ISO/IEC 9899, qui est défini dans stddef.h . 1 Il peut être importée davantage par l'inclusion de stdlib.h comme ce fichier sous inclut stddef.h .

Ce type est utilisé pour représenter la taille d'un objet. Les fonctions de la bibliothèque qui prennent ou retournent des tailles s'attendent à ce qu'elles soient de type ou aient le type de retour de size_t . En outre, les fréquemment utilisé par le compilateur le plus fréquemment utilisé doit être évalué à une valeur constante compatible avec size_t .

Comme une implication, size_t est un type garanti pour contenir n'importe quel indice de tableau.

6 votes

"Les fonctions de la bibliothèque qui prennent ou renvoient des tailles s'attendent à ce qu'elles soient de type ... size_t". Sauf que stat() utilise off_t pour la taille d'un fichier.

70 votes

@Draemon Ce commentaire reflète une confusion fondamentale. size_t est pour les objets en mémoire. Le standard C ne définit même pas stat() o off_t (ce sont des définitions POSIX) ou tout ce qui concerne les disques ou les systèmes de fichiers - il s'arrête à FILE les courants. La gestion de la mémoire virtuelle est complètement différente des systèmes de fichiers et de la gestion des fichiers en ce qui concerne les exigences en matière de taille. off_t n'est pas pertinent ici.

3 votes

@jw013 : Je n'appellerais pas cela une confusion fondamentale, mais vous soulevez un point intéressant. Néanmoins, le texte cité ne dit pas "tailles des objets en mémoire", et "offset" est difficilement un bon nom pour un type de taille indépendamment de l'endroit où il est stocké.

258voto

Alok Singhal Points 33073

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 .

13 votes

@Alok : Deux questions : 1) quelle est la taille de size_t ? 2) pourquoi devrais-je préférer size_t sur quelque chose comme unsigned int ?

1 votes

size_t n'est pas garanti d'être la même chose que unsigned int (vous semblez sous-entendre que c'est la même chose).

2 votes

@Lazer : la taille de size_t es sizeof(size_t) . La norme C garantit que SIZE_MAX sera d'au moins 65535. size_t est le type renvoyé par sizeof et est utilisé dans la bibliothèque standard (par exemple strlen renvoie à size_t ). Comme l'a dit Brendan, size_t ne doit pas nécessairement être la même chose que unsigned int .

96voto

Arjun Sreedharan Points 1387

size_t est un type qui peut contenir n'importe quel indice de tableau.

Selon l'implémentation, il peut s'agir de l'un des éléments suivants :

unsigned char

unsigned short

unsigned int

unsigned long

unsigned long long

Voici comment size_t est défini dans stddef.h de ma machine :

typedef unsigned long size_t;

4 votes

Certainement typedef unsigned long size_t dépend du compilateur. Ou bien suggérez-vous que c'est toujours le cas ?

4 votes

@chux : En effet, ce n'est pas parce qu'une implémentation le définit comme tel que toutes le font. Un exemple concret : Windows 64 bits. unsigned long est de 32 bits, size_t est de 64 bits.

2 votes

Quel est le but de size_t exactement ? Quand je peux créer une variable pour moi-même comme : "int mysize_t ;" ou "long mysize_t" ou "unsigned long mysize_t". Pourquoi quelqu'un aurait-il dû créer cette variable pour moi ?

26voto

codaddict Points 154968

La page de manuel de types.h dit :

size_t doit être un type d'entier non signé

6voto

Vikas Verma Points 412

Lire l'article _A propos de size_t et ptrdiff_t_ . Vous obtiendrez toutes les réponses à vos questions à partir de là.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X