Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/04/2021, à 13:08

zephyre123

[RESOLU] C'est quoi le type size_t ?

Bonjour,

En ce moment j'étudie la bibliothèque string.h, à commence par la première fonction strlen.
Le prototype de la fonction strlen = size_t strlen( const char *str )
C'est quoi size_t ?
Tout ce que je peux dire c'est que ça renvois un entier, mais dans ce cas pourquoi ne pas avoir mis un type d'entier classique (short < int < long < long long) ?
Pouvez vous m'éclairer svp ?

Dernière modification par zephyre123 (Le 30/04/2021, à 20:49)

Hors ligne

#2 Le 26/04/2021, à 13:15

grigouille

Re : [RESOLU] C'est quoi le type size_t ?

C'est un entier non signé dont la taille dépend du système. Il doit pouvoir renvoyer la taille en "bytes" (octets) de n'importe quel objet.


Xubuntu 20.04
HP LaserJet M1132 MFP

Hors ligne

#3 Le 26/04/2021, à 13:47

zephyre123

Re : [RESOLU] C'est quoi le type size_t ?

Ok grigouille merci.
Juste pour confirmer comme le type size_t renvois la taille de n'importe quel objet mais il doit bien avoir une taille max non ?
Sinon comment il est codé ?
Dans ce cas pourquoi ne pas avoir utilisé un unsigned long long par exemple le plus gros type d'entier non signé ?

Hors ligne

#4 Le 26/04/2021, à 14:07

grigouille

Re : [RESOLU] C'est quoi le type size_t ?

Un alias est plus "pratique" que "unsigned long long".
Un peu de lecture :
https://en.cppreference.com/w/cpp/types/size_t


Xubuntu 20.04
HP LaserJet M1132 MFP

Hors ligne

#5 Le 26/04/2021, à 14:22

zephyre123

Re : [RESOLU] C'est quoi le type size_t ?

Merci grigouille oui et dans ta doc il dise bien que sa peut retourner la taille de n'importe quels objets y compris les tableaux (array).
Je  me demande vraiment comment c'est possible mais à mon avis il doit y avoir une taille max certes très grandes mais une taille max tout de mêmes les capacités d'un ordinateur qui n'est autre qu'une super calculatrice ne peux pas être infini.

Hors ligne

#6 Le 26/04/2021, à 20:51

ssdg

Re : [RESOLU] C'est quoi le type size_t ?

On pretends que bill gates aurait dit:

Bill Gates a écrit :

640K ought to be enough for anybody.

640 Ko devraient suffire pour n'importe qui.

Quand on voudra simuler les électrons dans une étoile a neutrons, il nous faudra des tableaux d'une taille encore inimaginable.

C a prévu un "faux type" pour que ton programme suffise toujours si tu ne cherches pas a le faire rentrer dans le vrai type. Si tu trouve un compilateur pour la gameboy, tes adresses seront sur 8 bits et tes tailles marcheront. J'ai eu la chance de commencer avec de l'adressage 16bits. Quand on m'a donné mon formier pc+os avec adressage 32bits j'ai trouvé ca génial, j'avais de la RAM par dessus la tête,  etc...

Une dizaine d'années plus tard, je.découvre qu'on peut avoir besoin de plus.de 4Go de RAM. ( édition vidéo, dev de trucs compliqués, ...)

Quand un PC avec des adresses 128bits sortira, les bons codes C y passeront sans problèmes.  Les mauvais ne compileront plus avec les libs de l'OS ou seront pourris de bugs.

Pour certains C'est même une "bonne pratique" de nommer ou mieux d'encapsuler les vrais types dans un nom dédié.  Par exemple, qui irait faire une opération bit a bit sur une quantité de pommes ou multiplier des mètres  avec le pourcentage de votes aux élections pour Gérard Leroux. ( nom sorti du chapeau)


s'il n'y a pas de solution, c'est qu'il n'y a pas de problème... ou pas.

Hors ligne

#7 Le 26/04/2021, à 21:41

kamaris

Re : [RESOLU] C'est quoi le type size_t ?

zephyre123 a écrit :

Je  me demande vraiment comment c'est possible mais à mon avis il doit y avoir une taille max certes très grandes mais une taille max tout de mêmes les capacités d'un ordinateur qui n'est autre qu'une super calculatrice ne peux pas être infini.

man size_t a écrit :

       size_t
              […]
              Used for a count of bytes.  It is the result of the sizeof operator.  According to the C language standard, it shall be an unsigned integer type capable of storing values  in  the  range  [0, SIZE_MAX].
              According to POSIX, the implementation shall support one or more programming environments where the width of size_t is no greater than the width of the type long.

Hors ligne

#8 Le 26/04/2021, à 22:01

Nuliel

Re : [RESOLU] C'est quoi le type size_t ?

Bonjour,
J'aimerais rajouter deux choses.
Tu peux utiliser sizeof(size_t) pour connaître la taille en octets de size_t.
Attention aux chaînes de caractères, si ta chaîne de caractère ne finit pas par le caractère nul, alors strlen va te renvoyer au choix la bonne valeur si l'octet après ton buffer est à 0, une valeur foireuse ou parfois un segfault.
Ex:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
  int length = 3;
  char *s = malloc(length * sizeof(char));
  if (s == NULL)
    return EXIT_FAILURE;
  s[0] = 'a';
  s[1] = 'b';
  s[2] = '\0';
  printf("%d\n", strlen(s));
  free(s);
  return EXIT_SUCCESS;
}

retourne 2, dans le cas où on a pas s[2] = '\0' le comportement peut être inattendu.

Dernière modification par Nuliel (Le 26/04/2021, à 22:02)


[ poster un retour de commande ] [ poster une photo ]
Thinkpad x220, Dell latitude E7270 (i7 6600U, 16 Go de RAM, ...), Thinkstation E32 modifié: i5-4570, GTX 1060 6 Gb, 16 Gb de RAM, ...
Mon nouveau blog: nuliel.fr

Hors ligne

#9 Le 02/06/2021, à 11:11

ssdg

Re : [RESOLU] C'est quoi le type size_t ?

Nuliel a écrit :

Attention aux chaînes de caractères, si ta chaîne de caractère ne finit pas par le caractère nul, alors strlen va te renvoyer au choix la bonne valeur si l'octet après ton buffer est à 0, une valeur foireuse ou parfois un segfault.

Et en fonction de comment c'est traité dans les librairies C (de mon temps, c'était le pire des cas), une chaine C lue et transmise, ça peut être, en fonction de l'application des choses graves comme des mots de passe, des clefs privées, les données d'un autre utilisateur (comme son adresse, ou son mot de passe). Je sais que c'est hors sujet si on se pose juste la question de strlen, mais c'est suffisamment grave pour que je me permette un petit rappel.


s'il n'y a pas de solution, c'est qu'il n'y a pas de problème... ou pas.

Hors ligne