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 :

problème avec malloc


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 35
    Par défaut problème avec malloc
    Salut à tous, je bute sur un problème assez bizarre:

    Dans une fonction, si je fais

    char* s = malloc(12000);

    J'ai une erreur de segmentation (core dumped) lors de l'execution. Ca plante sur cette insctruction.

    Par contre si je fais

    char s[12000];
    ou
    char* s = malloc(12);

    Ca marche

    Le problème c'est que j'ai besoin d'un malloc(12000).

    Si ça peut aider, j'utilise xubuntu via virtual PC 2004 (avec 128mo de ram)

    Merci pour vos réponses

  2. #2
    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 cyril_sy
    Dans une fonction, si je fais
    char* s = malloc(12000);
    J'ai une erreur de segmentation (core dumped) lors de l'execution. Ca plante sur cette instruction.
    Il n'y a aucune raison 'normale' pour que malloc() s'exécute mal. Par contre il peut y avoir eu quelque chose avant qui a démoli le gestionnaire de mémoire, entrainant un comportement indéfini. (Débordement de tableau alloué, par exemple. Mortel !)

    Ensuite, pense à tester le valeur retournée par malloc() avant de l'utiliser : NULL signifie "échec d'allocation".

    Enfin, il faut libérer le bloc alloué après usage. (free()).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 35
    Par défaut
    merci pour ta réponse, oui je pense que le problème vient d'ailleurs.

    Quand je n'utilise pas la librairie libxml2, je n'ai pas de problèmes.

    Mais je ne pensais pas qu'une librairie puisse affecter malloc.

    Dans mon cas, malloc n'a pas le temps de renvoyer NULL, ça plante avant, pendant l'instruction...

    A ton avis ça peux venir de la librairie, ou c'est ailleurs dans le code?

  4. #4
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par cyril_sy
    A ton avis ça peux venir de la librairie, ou c'est ailleurs dans le code?
    Cela risque d'être difficile de t'aider si tu ne nous montres pas un peu de ton code...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 144
    Par défaut
    tu devrais caster à chaque fois que tu fais une allocation et vérifier s aussi

    char *s;

    s=(char *)malloc(12000*sizeof(char));

    if(s==NULL) return;

  6. #6
    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 Didier77
    tu devrais caster à chaque fois que tu fais une allocation et vérifier s aussi

    char *s;

    s=(char *)malloc(12000*sizeof(char));

    if(s==NULL) return;
    Vérifier, OK. Mais caster ? Pourquoi faire ?

    http://emmanuel-delahaye.developpez....tes.htm#malloc

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 35
    Par défaut
    C'est vrai que ça serait plus simple si je vous donnais une portion de code. Mais je n'ai aucune idée d'ou peut provenir le plantage, donc je ne peut pas selectionner une portion de code en particulier...

    Par contre, je n'ai rien changé au code, et maintenant j'ai cette erreur

    *** glibc detected *** ./main: free(): invalid next size (fast): 0x08055608 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0xb76e58bd]
    /lib/tls/i686/cmov/libc.so.6(__libc_free+0x84)[0xb76e5a44]
    /usr/lib/libxml2.so.2(xmlDictFree+0xc1)[0xb78922d1]
    /usr/lib/libxml2.so.2(xmlFreeDoc+0x1b9)[0xb77f4099]
    ./main[0x80489d5]
    ./main[0x8048f31]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xdc)[0xb76948cc]
    ./main[0x80487c1]

    Est ce que vous savez ce que ça veut dire?

    merci pour votre aide

  8. #8
    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 cyril_sy
    Est ce que vous savez ce que ça veut dire?
    Pas trop, mais je ne serais pas étonné que tu utilises mal une des fonctions de la bibliothèque XML. Je conseille ceci :

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

    Si tu vois des warnings, tu les analyses (on peut t'aider) et tu les corrige intelligemment (là aussi, on peut aider...).

  9. #9
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par cyril_sy
    *** glibc detected *** ./main: free(): invalid next size (fast): 0x08055608 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0xb76e58bd]
    /lib/tls/i686/cmov/libc.so.6(__libc_free+0x84)[0xb76e5a44]
    /usr/lib/libxml2.so.2(xmlDictFree+0xc1)[0xb78922d1]
    /usr/lib/libxml2.so.2(xmlFreeDoc+0x1b9)[0xb77f4099]
    ./main[0x80489d5]
    ./main[0x8048f31]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xdc)[0xb76948cc]
    ./main[0x80487c1]

    Est ce que vous savez ce que ça veut dire?
    Je ne suis pas un specialiste des messages de la glibc (loin de la) mais a vu de nez, il y a un free qui se passe mal. Tu dois passer (directement ou via la libxml) un pointeur a free qui n'est pas valide.
    * Verifie que tu ne modifies pas les valeurs des pointeurs retournes par malloc et par la libxml,
    * verifie que tu ne libere pas deux fois le meme pointeur (une bonne pratique est de mettre le pointeur a NULL lorsqu'il n'est plus valide),
    * et enfin verifies que tu n'as pas de debordement de buffer.

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

Discussions similaires

  1. problème avec malloc
    Par oeil de lynx dans le forum C
    Réponses: 16
    Dernier message: 03/04/2008, 16h24
  2. Problème avec malloc et autre
    Par ego dans le forum C
    Réponses: 5
    Dernier message: 02/05/2007, 18h29
  3. probléme avec malloc
    Par tomasi dans le forum C
    Réponses: 18
    Dernier message: 15/11/2006, 15h15
  4. Problème avec malloc
    Par f56bre dans le forum C
    Réponses: 11
    Dernier message: 13/11/2006, 14h36
  5. Problème avec malloc.
    Par kmitz dans le forum C
    Réponses: 2
    Dernier message: 25/03/2006, 18h05

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