IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Taille d'une chaine de caracteres dynamique


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 266
    Points : 113
    Points
    113
    Par défaut Taille d'une chaine de caracteres dynamique
    Salut,
    Je bloque sur un probleme tout con en apparence.
    J'utilise sizeof() pour connaitre la taille d'une chaine de caracteres (char *), mais sizeof n'a pas l'air de retourner la bonne valeur si la chaine est allouee avec malloc.
    example:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int main(int argc, char** argv){
       char chaine[10];
       printf("Taille de la chaine:%d\n", sizeof(chaine));
    --> ici ca m'affiche bien 10 (taille decidee a la compilation)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       char * chaine2 = (char*)malloc(10*sizeof(char));
       printf("Taille de la chaine:%d\n", sizeof(chaine2));
    --> Ici ca m'affiche 4 !!! alors que j'ai alloue 10 char avec malloc.

    Quelqu'un saurait-il comment recuperer la taille d'une chaine dont la taille est fixee par malloc ?

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    peut être que sizeof(char *) renvoi la taille d'un char *, c'est à dire 4 vu qu'il s'agit d'un pointeur ( la taille d'un pointeur vers quoique ce soit est 4, sur un système où ils sont codés sur un int )...

    Enfin bon, je suis pas expert non plus mais j'ai trouvé ce lien qui pourrai t'aider ...
    http://ymettier.free.fr/articles_lma...70/lmag70.html

    edit: au fait, strlen ne serait pas mieux par hasard ?
    http://c.developpez.com/faq/?page=strings

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Points : 62
    Points
    62
    Par défaut
    Quelqu'un saurait-il comment recuperer la taille d'une chaine dont la taille est fixee par malloc ?
    Si tu l'as créée, tu doit normalement connaitre sa taille.
    Si la taille est fixe, le mieux est surement de prendre l'habitude de travailler avec des constantes et des noms de variables qui veulent dire quelque chose.

    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #define TAILLE_NOM_CLIENT 25
    int main(int argc, char** argv){
    char *NomClientCassePied;
     
     
    NomClientCassePied =malloc(TAILLE_NOM_CLIENT+1);
    if(NomClientCassePied!=NULL)
      {
      // code
     
      // Libere la memoire allouée
      free(NomClientCassePied);
      NomClientCassePied=NULL;
      }
    }
    Si la longueur dépends d'une variable, le mieux est sûrement de l'initialiser de suite après le malloc et tu retrouvera sa taille avec strlen() qui retourne le nombre de caractères de la chaîne sans tenir compte du zéro terminal.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Points : 80
    Points
    80
    Par défaut
    A mon avi, c'est plutôt strlen() de string.h qu'il faut utiliser pour mesurer une chaine.

    J'ajouterais aussi qu'il n'est pas possible de mesurer la taille d'un tableau.

    En fait, si tu déclare un tableau de 10 à l'adresse 223450, rien ne tempèche d'aller lire l'adresse 223462 avec tableau[12].

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par BernardT Voir le message
    J'utilise sizeof()
    N'existe pas. C'est sizeof et c'est un opérateur. Il s'utilise soit avec un objet :
    soit avec un (type)
    dans les deux cas, il retourne une valeur de type size_t qui est la taille en nombre de bytes. Je rappelle que le byte est l'unité de compte de la mémoire en C. Comme toute unité, un byte vaut 1. Un char a exactement la taille d'un byte.
    pour connaitre la taille d'une chaine de caracteres (char *), mais sizeof n'a pas l'air de retourner la bonne valeur si la chaine est allouee avec malloc.
    Quand on créée un objet avec malloc(), on stocke l'adresse de celui-ci dans un pointeur du type désiré. Mais on ne sait pas si ce pointeur pointe sur une ou plusieurs instances de cet objet (tableau).

    Il n'y a aucun moyen portable de récupérer cette information. Il est donc de la responsabilité du programmeur de maintenir cette information. L'usage courant est de créer une structure qui regroupe :
    • l'adresse du bloc
    • le nombre d'éléments créés.
      et éventuellement
    • le nombre d'éléments utilisés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct tab_dyn
    {
       T *a;
       size_t nb_max;
       size_t last;
    };

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 266
    Points : 113
    Points
    113
    Par défaut
    probleme resolu en utilisant la structure indiquee par emmanuel delahaye.
    Merci a tous pour vos reponses !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PowerShell] Récuperer le contenu d'une chaine de caracteres de taille variable
    Par Parkiro69 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 20/02/2014, 09h01
  2. Taille Tableau indice Chaine de caractere dynamique
    Par iamslyper dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 19/04/2011, 20h30
  3. Réponses: 6
    Dernier message: 04/03/2011, 13h51
  4. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  5. Controler une chaine de caracteres ou d'entiers?
    Par Le druide dans le forum C
    Réponses: 6
    Dernier message: 25/09/2003, 08h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo