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 :

utilisation pointeurs et structures


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Par défaut utilisation pointeurs et structures
    Bonjour,

    Voila plusieurs fois que j'écris des fonctions qui mènent au plantage peu de temps APRES leur execution (pas directement pendant l'exécution des lignes suspectées). Pour l'exemple suivant, j'obtiens le message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *** glibc detected *** escargot: corrupted double-linked list: 0x00024010 ***
    Ci après, un extrait de mon programme.
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    int main(int argc, char **argv){
        ...
        TypeJeu Jeu;
        initJeuWithArg(&Jeu, argc, argv);
        ...
    #ifndef PLANTAGE // cas qui est fonctionnel
        sprintf(msg, DEFAULT_DISPLAY_MSG);
        char tmp2=strlen(msg);
        Jeu.pMessageAttente=malloc(sizeof(char)*(tmp2+1));
        strcpy(Jeu.pMessageAttente, msg);
    #endif
        ...
    }
     
     
    void initJeuWithArg(TypeJeu* pJeu, int argc, char **argv){
        initJeu(pJeu);
        ...
    }
     
     
     
    void initJeu(TypeJeu* pJeu){
        ...
    #ifdef PLANTAGE // cas qui mène au plantage
        sprintf(msg, DEFAULT_DISPLAY_MSG);
        char tmp=strlen(msg);
        pJeu->pMessageAttente=malloc(sizeof(char)*(tmp+1));
        strcpy(pJeu->pMessageAttente, msg);
    #else
        pJeu->pMessageAttente=NULL;
    #endif
        ...
    }
     
     
    typedef struct
    {
        ...
        char* pMessageAttente;
        ...
    }
    TypeJeu;
    Je suppute une mauvaise utilisation des pointeurs et des malloc, mais j'ai beau chercher je ne vois pas où. Je tombe régulièrement sur le problème lors de l'écriture de nouvelles fonctions, donc il est peut-être temps que j'ouvre les yeux...

    Pouvez-vous m'aider ?

    Salutations,
    Vincent

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Comment est déclaré "msg" ?

    Le code mis en évidence me semble correct. Tu as probablement un écrasement mémoire ailleurs.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 478
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Le code mis en évidence me semble correct. Tu as probablement un écrasement mémoire ailleurs.
    Effectivement.

    Il est probable également qu'il s'agisse d'un free() libéré deux fois ou (surtout) d'un pointeur invalide passé à cette même fonction.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Il est probable également qu'il s'agisse d'un free() libéré deux fois
    Cela m'étonnerai que ça vienne d'en dehors de la fonction car l'autre version (sans fonction) est fonctionnelle.

    Citation Envoyé par Obsidian Voir le message
    ou (surtout) d'un pointeur invalide passé à cette même fonction.
    Que dois-je vérifier par rapport à ça ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Par défaut utilisation pointeurs et structures
    Bon j’admets que le problème puisse venir d'ailleurs que la fonction présentée. Dans le cas que j'ai présenté comme posant problème, j'ai ajouté des printf un peu partout et le programme fonctionne. Quand je retire ces derniers à l'aide d'une macro spécifique, ça plante comme auparavant.

    Je suspecte un problème dans l'utilisation de libxml2. Quel outil dois-je utiliser pour voir à quoi correspond l'adresse 0x00024010
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *** glibc detected *** escargot: corrupted double-linked list: 0x00024010 ***
    Par rapport à d'autres traces que j'ai ajouté, le programme plante dans l'appel de xmlXPathEvalExpression().

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Tu peux utiliser valgrind (memcheck) ou dr memory pour traquer ce genre de problèmes.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Comment est déclaré "msg" ?
    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
    void initJeu(TypeJeu* pJeu){
        char msg[DEFAULT_DISPLAY_NB_CAR+1];
        strcpy(pJeu->langue,"FRA"); // TODO choix de la langue
        pJeu->i2cLedsID=0;
        pJeu->pidSon=0;
        //pJeu->pMessageAttente=NULL;
    #ifdef MALLOC_DANS_INIT_JEU
        sprintf(msg, DEFAULT_DISPLAY_MSG);
        char tmp=strlen(msg);
        pJeu->pMessageAttente=malloc(sizeof(char)*(tmp+1));
        strcpy(pJeu->pMessageAttente, msg);
    #else
        pJeu->pMessageAttente=NULL;
    #endif
        pJeu->dureeAff=DEFAULT_DISPLAY_PERIOD;
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define DEFAULT_DISPLAY_MSG "?"
    #define DEFAULT_DISPLAY_NB_CAR 1

Discussions similaires

  1. Utilisation pointeurs et structures imbriquées
    Par vincenet dans le forum Débuter
    Réponses: 3
    Dernier message: 26/05/2014, 21h03
  2. Réponses: 7
    Dernier message: 08/04/2006, 12h18
  3. Pointeurs et structures...
    Par vinzzzz dans le forum C
    Réponses: 13
    Dernier message: 18/01/2006, 11h37
  4. utilisation d'une structure
    Par charonDZenfer dans le forum C++
    Réponses: 8
    Dernier message: 23/08/2004, 16h21
  5. probleme avec pointeurs de structures
    Par remi77 dans le forum C
    Réponses: 2
    Dernier message: 20/10/2003, 13h19

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