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 :

new char[size] aloue plus que size


Sujet :

C++

  1. #1
    Membre éclairé Avatar de lastrecrue
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    360
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 360
    Par défaut new char[size] aloue plus que size
    j'ai eu petite problème dans programme, en essuyant de comprendre ou réside le probelem j'ai découvert ceci .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    string str;
        getline( cin , str );
        size_t size = str.size() + 1;
        char * Mot = new char[ size ];
        cout << (int)size << endl;
        cout << (int)strlen(Mot) << endl;
    si on exécute ce bout de code on remarque que strlen donne un nombre supérieure a strlen alors qu'on viens d'allouer size char pour Mot, comment ca se peut.

  2. #2
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 61
    Par défaut
    Bonjour,

    Pour moi le probleme que tu penses avoir, vient du fait que tu new un char * et que apres tu veux faire un strlen, mais entre temps tu as rien fait avec ton char *, donc tu fais un strlen de rien du tout, c est peut-etre la que vient le probleme, si tu remplis ton char *Mot, peut-etre que ca ira mieux.

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    strlen s'arrête sur le premier caractère \0 qu'il trouve. Or sur de la mémoire non initialisée comme ici, ce \0 peut se trouver n'importe où, y conpris en dehors de l'espace alloué.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    En plus, il est généralement déconseillé de vouloir gérer les chaînes de caractères à la manière "C style"(tableau de caractère terminé par '\0')...

    Si - *vraiment* - il te faut la valeur d'une chaîne au format C style, tu peux tout simplement utiliser la méthode c_str() fournie avec la classe std::string.

    Entre-temps, il est bien plus sécurisant d'utiliser exclusivement la std::string (et ses acolytes istringstream/ostringstream si tu a des conversions à faire) aussi loin que possible pour t'éviter tous les problème inhérants aux tableaux alloués dynamiquement (nécessité d'utiliser strcpy/memcpy ou similaires, risque de dépassement de capacité, oubli de désallocation de ressources, j'en passe et de meilleures )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre éclairé Avatar de lastrecrue
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    360
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 360
    Par défaut
    j' ai fais attention a ça, en fait ce que je fait juste après c'est mettre str dans Mot mais mon compilateur me donne un avertissement, mon programme fonctionne, mais ça fais pas très beau mon avertissement à cause de strncpy

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par lastrecrue Voir le message
    j' ai fais attention a ca, en fait ce que je fai juste apres c'est metre str dans Mot mais mon compilateur me donne un warning, mon programme fonctionne, mais ca fais pas tres beau mon warning acause de strncpy
    Heuu... Et avec le décodeur, ca donne quoi

    Désolé, mais là, j'ai un mal fou à comprendre
    • ce que tu écris
    • ce que tu as fait

    Et je présumes que je ne suis pas le seul dans le cas
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Si tu veux absolument utiliser un tableau de char, il te faut non seulement recopier chaque caractère depuis ta string vers ton tableau (avec une fonction de la stl si tu veux), mais aussi mettre le dernier char à zéro, sous peine de corompre ta mémoire si tu fait d'autres opérations ensuite.

    Pour ton warning, je suppose que tu utilise visual studio qui n'aime plus ces fonctions de manipulation de chaînes de la stl. Pour les faire disparaître, soit tu utilise leur version à eux (avec suffixe _s), soit tu fais un define qui stoppera les warnings.

    Vas voir : http://msdn2.microsoft.com/en-us/lib...59(VS.80).aspx

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Si tu veux absolument utiliser un tableau de char, il te faut non seulement recopier chaque caractère depuis ta string vers ton tableau (avec une fonction de la stl si tu veux), mais aussi mettre le dernier char à zéro, sous peine de corompre ta mémoire si tu fait d'autres opérations ensuite.
    En fait, je suis peut-être buté, mais je n'arrive pas à trouver le moindre cas qui pourrait s'appliquer au fait de choisir de faire une copie du tableau de caractères plutôt que de faire la copie de la chaîne, quitte à récupérer le tableau de caractères sur cette copie...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Je ne vois pas non plus mais ce n'est pas important.

    Le conseil d'utiliser std::string a été donné, si le programmeur veut tout de même utiliser des tableaux de char, il faut le laisser faire et lui donner les moyens d'y arriver comme ça. Il s'apercevra par lui même bien assez tôt que la manipulation de tableau de char peut vite devenir dangereuse et surtout demande beaucoup d'efforts pour finalement peu d'apports.

    Mais bidouiller comme ça est un très bon exercice, je l'ai fait avant lui et je regrette pas. Ca ne me viendrait aujourd'hui simplement plus à l'idée de le faire dans un vrai projet.

  10. #10
    Membre éclairé Avatar de lastrecrue
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    360
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 360
    Par défaut
    bon, pour répondre a la question la plus récurrente, j'ai utilisé des char* car la tendance dans ma classe les char.

    Sinon, et pour ça je suis près a changer mon programme, même si je devais essayer avant de vous raconter du n'importe quoi, j'implémente un anlayseur syntaxique, alors j'ai besoin d'étudier ma chaîne caractère par caractère, alors j'ai pensé a char*, je me demande bien si un élément d'un chaîne de string est un char???

    après pour répondre a une question comme ça sur la route j'ai utiliser la lecture dans un string pour profiter du getline ( lire les espace )+ ne pas me prendre la tête avec l'allocation au départ, pour cela le size dans mon bout de code.
    pour finir, même si je crois que la réponse et déjà dans la faq, est ce que je fais vraiment du n'importe quoi en passant par un string ou on choisissant d'analyser une phrase comme étant une chaîne de carctères????

  11. #11
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    En fait, il me semble la classe string gère sa chaîne de caractère comme elle le désire, un ou plusieurs tableaux de char, on ne peut pas le savoir, mais le gros avantage c'est que tu n'a pas à gérer d'allocations toi-même et que de nombreux services sont proposés pour te simplifier la vie et à moindre coût.

    Par exemple tu peux accéder à n'importe quel caractère de la string et t'en servant comme d'un tableau, avec les crochets. Tu peux ainsi parcourir chaque caractère de 0 jusqu'à .size() avec un indice. Tu peux aussi utiliser les iterateurs pour appréhender une notion récurrente du C++.

    Si jamais tu as besoin d'un pointeur vers le tableau de char correspondant pour le passer à une fonction qui n'accepte que ça, tu peux utiliser la méthode .c_str() mais celui-ci n'est pas modifiable.

  12. #12
    Membre éclairé Avatar de lastrecrue
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    360
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 360
    Par défaut
    salut
    j'ai enfin osé me débarrasser des char définitivement, j'ai tout refais avec des string...

    merci pour tout.

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

Discussions similaires

  1. Qu'est-ce-que perl à de plus que les autres ?
    Par Celelibi dans le forum Langage
    Réponses: 7
    Dernier message: 24/08/2005, 01h00
  2. height: encore plus que 100%
    Par Anduriel dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 23/06/2005, 13h56

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