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 :

Un malloc pollué


Sujet :

C

  1. #1
    Membre très actif Avatar de tim974
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 175
    Par défaut Un malloc pollué
    Le problème est le suivant : Au début de ma chaine concaténée se trouve 3 caractères parasites du type "?3X" ( Le X est variable). Cette apparition se fait dés que j'utilise le malloc de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        char   *   p   =   (char   *)malloc(n*sizeof(char));
    Auriez-vous quelques pistes sur lesquelles m'orienter ?

    merci.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Le rôle de la fonction malloc() est d'allouer de la mémoire, pas de l'initialiser.

    Donc, les 3 "caractères parasites", c'est pas grave, c'est des reliquats d'autre chose.

    Maintenant, si tu veux vraiment faire "propre" après ton malloc, tu fait un memset() mais c'est pas très utile.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre très actif Avatar de tim974
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 175
    Par défaut
    merci pour la réponse,

    J'ai utilisé le malloc pour pouvoir y placer une chaine de caractère avec une taille variable, elle peut être vide ou trés grosse en fonction du nombre de personnes utilisant l'application. En gros, c'est une concaténation de tout les prénoms. Je me suis naturellement orienté vers le malloc pour une attribution dynamique de la mémoire, pour économiser le max de ressources et la libérer. Mais je dois avouer que je ne suis pas un expert de ce type d'opération. C'est pourquoi ces éléments parasites me gênent, car il se mettent avec la suite de ma chaine et crée un prénom avec un préfixe qui ne doit pas exister.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Montre plutôt ce que tu fais juste après le malloc()...
    Et aussi, d'où vient n...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre très actif Avatar de tim974
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 175
    Par défaut
    Justement j'obtiens ces parasites juste après le malloc..avant toute autre opération.
    Lorsque j'affiche la variable avec un printf, j'obtiens en mode console :

    maVariable = ?3&

    Alors que j'ai pas encore agis sur elle (juste apres malloc).

    n correspond au nombre de prénoms que j'y place, par exemple n=20

    Ensuite, lorsque je concatène, j'obtiens : maVariable = ?3&maListedePrenoms

    Même avec le memset, je n'arrive pas à la virer.

    D'ailleurs, si vous avez une meilleure solution pour générer une chaine de caractère avec longueur dynamique, je suis partant!

    merci.

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Concaténation signifie "ajouter une chaîne à la fin d'une autre". La concaténation suppose donc qu'une première chaîne existe et du coup, la fonction de concaténation en cherche une dans le tableau alloué et en trouvera une.
    Si on veut utiliser cette fonction alors que cette première chaîne n'existe pas, il faut "fabriquer" cette chaîne sous la forme d'une chaîne vide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    p = malloc(....);
    p[0] = '\0';
    strcat(p, ...);

  7. #7
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par tim974
    Justement j'obtiens ces parasites juste après le malloc..avant toute autre opération.
    <...>
    Citation Envoyé par ram_0000
    Le rôle de la fonction malloc() est d'allouer de la mémoire, pas de l'initialiser.
    <...>
    Tout est dit je pense, c'est à toi que reviens la tâche d'initialiser cet espace mémoire, dans ton cas cela peut être un simple :
    ou alors un memset :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     memset ( p , 0, n);

  8. #8
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    quand tu fait un malloc(), la même zone mémoire est alloué (puisque tu la libère avant)

    donc supposons que la zone alloué contient déjà ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {?3&00sdf0sd0fs0dfds0fsdfs0df}
    alors, quand tu fait un strcat avec cette zone, le compilateur va chercher la fin de la chaîne précédente pour ajouter (en écrasant le zéro) la nouvelle chaîne...

    dans notre exemple, il y a déjà une chaîne dans la zone mémoire qui est "?3&", donc, il va ajouter tous les mot après ces cratères....


    la solution est comme c'est déjà conseillé, initialisé votre chaîne avant de faire les opérations dessus !!!!

  9. #9
    Membre très actif Avatar de tim974
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 175
    Par défaut
    Merci à tout le monde, le memset marche nickel maintenant

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    La mémoire retournée par malloc() n'est pas initialisée.
    Un printf() sur de la mémoire non-initialisée est un comportement indéfini.

    Donc, si tu vais un printf() sur de la mémoire que tu viens juste d'allouer sans l'initialiser, c'est un comportement indéfini : Tout peut arriver.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    d'ailleurs je ne vois pas la raison de cet entêtement à utiliser malloc (+memset) alors que calloc le fait si bien avec un seul appel....

    Je préfère taper une virgule de plus qu'une ligne.....

  12. #12
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    Au lieu d'utiliser le malloc(), on pourrait aussi utiliser un calloc, qui lui alloue et initialise la zone mémoire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /*calloc() alloue la mémoire nécessaire pour un tableau nmemb éléments,
    chacun d'eux représentant size octets, et renvoie un pointeur vers la
    mémoire allouée. Cette zone est remplie avec des zéros.*/
    void *calloc (size_t nmemb, size_t size);

  13. #13
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        char   *   p   =   (char   *)malloc(n*sizeof(char));
    Citation Envoyé par tim974
    n correspond au nombre de prénoms que j'y place, par exemple n=20
    Avec cette allocation dynamique, tu réserves une zone mémoire pour 20 caractères (19 caractères + le caractère de fin de chaine).
    Dans ton cas, ca fait un long prénom... puisque il pourra être au maximum de 19 caractères mais en tout cas tu ne pourras mémoriser 20 prénoms!
    Tu dois donc soit faire un tableau à deux dimensions, soit un tableau de pointeurs sur chaines de caractères.

  14. #14
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    d'ailleurs je ne vois pas la raison de cet entêtement à utiliser malloc (+memset) alors que calloc le fait si bien avec un seul appel....

    Je préfère taper une virgule de plus qu'une ligne.....
    J'ai lus quelque part que le couple malloc/memset était d'une rapidité notable face à calloc, ceci peut être un argument

    sinon j'ai trouver ceci :
    * I think calloc can allocate and initialize memory, if the
    asked memory is available contiguously where as malloc can
    allocate even if the memory is not available contiguously but
    available at different locations.
    Je ne sais pas si c'est vrai ni comment cela est géré en interne pour nous faire croire que l'on dispose d'un bloc contigus, si quelqu'un peut fournir des explications la-dessus ?
    MERCI !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    J'ai lus quelque part que le couple malloc/memset était d'une rapidité notable face à calloc, ceci peut être un argument
    Vu que calloc() est implémenté avec malloc() suivi de memset() (c'est la norme), je ne vois pas trop la différence...
    Je ne sais pas si c'est vrai ni comment cela est géré en interne pour nous faire croire que l'on dispose d'un bloc contigus, si quelqu'un peut fournir des explications la-dessus ?
    La mémoire allouée est garantie être contiguë (sinon, on ne saurait pas faire de tableaux, ni de structures dynamiques, un peu de logique). Faut pas croire tout ce qu'on lit sur le net. Il y a énormément d'âneries...

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

Discussions similaires

  1. Erreur windows lors du malloc
    Par Elessar dans le forum C
    Réponses: 5
    Dernier message: 16/12/2003, 08h53
  2. malloc et free
    Par barthelv dans le forum C
    Réponses: 3
    Dernier message: 22/07/2003, 18h34
  3. Pb : malloc qui marche une fois sur deux .... ?
    Par guillaume_pfr dans le forum C
    Réponses: 14
    Dernier message: 21/07/2003, 09h52
  4. Erreur de sgmentation avec malloc
    Par simonm dans le forum C
    Réponses: 5
    Dernier message: 27/02/2003, 08h29
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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