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 :

Malloc et affectation de mémoire


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par défaut Malloc et affectation de mémoire
    Bonjour,

    J'ai un petit soucis quant à l'allocation de mémoire pour un char* avec l'utilisation de malloc.
    Voici mon code (bien allégé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char *fichier;
    int taille =1504;
     
    if(fichier = (char*)malloc(taille))
              {
     
                    len = strlen( fichier );
                    printf("Taille = %i \n", len);
                    ...
                    //mon code
              }
    Lorsque je fais mon printf, la taille affichée est 1520 (alors que cela devraot etre 1504, non?).
    De plus, lorsque j'affiche ma chaine "fichier" non remplie, j'obtiens en fin de chaine " ²²²²½½½½½½½½¯■¯■ " qui correspondent à ces 16 car en trop...

    Comment rectifier le problème et faire en sorte que fichier ne contienne que 1504 char sans les indésirables de la fin ?

    Merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    La variable fichier n'est pas initialisée après le malloc donc le strlen(fichier) n'a aucun sens.
    Il faudrait affecter une valeur à la variable fichier pour que le calcul de sa taille ait un sens

  3. #3
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    char fichier[1504]?

  4. #4
    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
    Tu es sûr que tu fais du C++ ? Tout ça c'est du pur C.

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par défaut
    arghh,
    oui, c'est vrai que je jongle entre c et c++, désolé.
    Mais dans le cas ou j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char   *fichier = new char[1504]; // 1504, ca pourrait etre un autre nombre, c'est juste que je veux mettre bcp de char...
    au lieu de malloc, ca me fait le meme probleme...

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par défaut
    Citation Envoyé par ep31
    La variable fichier n'est pas initialisée après le malloc donc le strlen(fichier) n'a aucun sens.
    Il faudrait affecter une valeur à la variable fichier pour que le calcul de sa taille ait un sens
    Soit, mais vu que l'espace mémoire est allouée, cela devrait suffire. Dans mon cas ca m'affiche bien, à peu de chose pret (et c'est ce "peu" qui me dérange!!!), ma taille de 1504 (enfin, cela affiche 1520 mais c'est 1504 que je veux ).

  7. #7
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    pourquoi pas simplement char fichier[1504] ? (meme si ce n'est pas le pb!)
    sinon bzero(&fichier,sizeof(fichier)); m'a évité des trucs... bizarres!

  8. #8
    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
    Soit, mais vu que l'espace mémoire est allouée, cela devrait suffire
    strlen ne fait que parcourir la chaîne jusqu'à rencontrer un 0. Vu que ta chaîne contient n'importe quoi, le résultat est lui aussi n'importe quoi.

    Si ta question est "comment savoir quelle taille est allouée au bout d'un pointeur" alors la réponse est que ça n'est pas possible directement.

    Si tu fais vraiment du C++ alors tu devrais utiliser std::string ou std::vector.

    pourquoi pas simplement char fichier[1504] ?
    Parce que
    // 1504, ca pourrait etre un autre nombre, c'est juste que je veux mettre bcp de char...

  9. #9
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Il y a n'importe quoi dans ton tableau, et strlen cherche le premier '\0' dedans. Si tu n'as pas de bol, il n'y en a aucun dans tout ton tableau.

    Tu confondrais pas sizeof et strlen ?

  10. #10
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par défaut
    Citation Envoyé par lun4t1k
    pourquoi pas simplement char fichier[1504] ?
    C'est simple et j'y avais pas songé... je vais essayé cela ! Merci de m'avoir un peu raffraichi la mémoire lol

    Edit : Finalement, comme la di Laurent Gomila, faut mieux pas alors....

  11. #11
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par défaut
    Citation Envoyé par Ulmo
    Il y a n'importe quoi dans ton tableau, et strlen cherche le premier '\0' dedans. Si tu n'as pas de bol, il n'y en a aucun dans tout ton tableau.

    Tu confondrais pas sizeof et strlen ?
    HEu non, je ne pense pas confondre, strlen permet d'obtenir la taille d'un string donc c'est bien ca...

  12. #12
    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
    Tu as l'air un peu perdu... tu veux faire quoi au juste avec ce tableau ?

  13. #13
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par défaut
    Bon, je vais m'obstiner une peu (désolé )en changeant légèrement mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int taille2 = 1500;
    char *fichier2 = new char[taille2];
    cout<<"taille :"<< strlen( fichier2 );
    J'ai donc d'affiché "taille :1512" ... Je me demande toujours si le résultat est normal...

  14. #14
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Tu n'as rien changé, le contenu de ton tableau n'est toujours pas initialisé.
    Essaye comme ça pour voir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int taille2 = 1500;
    char *fichier2 = new char[taille2];
    fichier2[0] = '\0';
    cout<<"taille :"<< strlen( fichier2 );

  15. #15
    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
    J'ai donc d'affiché "taille :1512" ... Je me demande toujours si le résultat est normal...
    Qu'est-ce qui est incompréhensible dans "strlen cherche un 0, or ta chaîne contient n'importe quoi" ?

  16. #16
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par défaut
    Citation Envoyé par Laurent Gomila
    Tu as l'air un peu perdu... tu veux faire quoi au juste avec ce tableau ?
    Et bien, je vais stoquer un certain nombre de char en provenance d'un fichier.
    pour cela il me faut une variable pour les stoquer doù mon char* fichier.
    Mais comme , je ne vais pas demander toujours le meme nombre de char(parfois 1500, parfois 150...), il faut que cela soit legerement flexible.

    Enfin, puisque , à la fin je veux recuperer les chars stoquer dans ma variable pour les afficher. Et si , il y en a 1512 (au lieu de 1500 du a une mauvaise allocation), et bien cela m'affichera 12 char de trop...

    J'espere que je suis pas trop désordonné dans mes explications et que tu arrives a me suivre

  17. #17
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Citation Envoyé par Chop_chop
    HEu non, je ne pense pas confondre, strlen permet d'obtenir la taille d'un string donc c'est bien ca...
    Et où as-tu vu un string ? Il n'y en a pas dans ton code.

  18. #18
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par défaut
    Citation Envoyé par Laurent Gomila
    Qu'est-ce qui est incompréhensible dans "strlen cherche un 0, or ta chaîne contient n'importe quoi" ?
    Oyui, mais elle ne devrait pas contenir plus de 1500 char, non ? et elle me di que cela fait 1512... (désolé d'etre autant borné, je ne comprend pas trop)

  19. #19
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par défaut
    Citation Envoyé par Ulmo
    Et où as-tu vu un string ? Il n'y en a pas dans ton code.
    heu char* peut etre considéré comme un string pour certaines fonctions, non?
    Désolé si j'affirme des choses qui sont fausses si c'est le cas.

  20. #20
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Citation Envoyé par Chop_chop
    heu char* peut etre considéré comme un string pour certaines fonctions, non?
    1. En C++ les chaines de caractères sont des std::string et pas des char *
    2. Tant qu'il n'y a pas de '\0' terminal, ce n'est pas une chaine valide

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Allocation mémoire : tableau vs malloc
    Par scorbo dans le forum Débuter
    Réponses: 4
    Dernier message: 15/06/2007, 12h47
  2. Réponses: 20
    Dernier message: 13/02/2007, 11h50
  3. Réponses: 4
    Dernier message: 20/11/2006, 01h02
  4. Recoder malloc -> Questions sur la mémoire
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 15/03/2006, 18h11
  5. Pb d'allocation mémoire malloc
    Par oz80 dans le forum C++
    Réponses: 5
    Dernier message: 18/11/2005, 17h23

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