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 :

erreur segmentation realloc


Sujet :

C

Vue hybride

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 31
    Par défaut erreur segmentation realloc
    Bonjour,
    j'ai une "erreur de segmentation" au niveau de realloc, et j arrive pas à la resoudre.
    Alors bienvenue à toute proposition, et merci d'avance.

    je travail sur un tableau dynamique de type suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct livre {
      char* titre;
      char* auteur;
      int num;
    }s_livre;
    Voici le code source :
    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
    s_livre* recherche_auteur(s_livre* tab, char* auteur)
    {
     
      s_livre *livre;
      int i=0, cpt = 0;
     
      while(tab+i)
        {
          if(strcmp(tab[i].auteur, auteur) == 0)
            {
              livre = realloc(livre, sizeof(s_livre)*(cpt+1));
              livre[cpt].num = tab[i].num;
              livre[cpt].auteur = tab[i].auteur;
              livre[cpt].titre = tab[i].titre;
              cpt++;
            }
          i++;
        }
      return livre;
    }

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    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 486
    Par défaut
    Citation Envoyé par Msakeni Voir le message
    Bonjour,
    j'ai une "erreur de segmentation" au niveau de realloc, et j arrive pas à la resoudre.
    C'est normal, tu cherches à réallouer quelque chose que tu n'as pas alloué. À la limite, realloc() est capable de s'en rendre compte seul si le pointeur qui pointe la zone à réallouer (et qui, donc, n'existe pas encore) est à NULL.

    Et en l'occurrence, il ne l'est pas. Tu as déclaré ton pointeur sans l'initialiser : sa valeur correspond donc à ce qui se trouve en mémoire à cet endroit et à ce moment-là. La valeur de ton pointeur est donc complètement indéfinie et qui a une chance sur 4.294.967.296 de tomber sur NULL. realloc() va croire que c'est une zone allouée et va planter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    s_livre* recherche_auteur(s_livre* tab, char* auteur)
    {
    
      s_livre *livre = NULL;

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 31
    Par défaut
    Je vous remercie Obsidian
    j'avais pas penser à ca, c'est la premier fois ke je vois ce cas.

    Si je me permet, je voudrai vous poser presnté encore un petit souci de meme type "erruer de segmentation", touours je toruve du mal à debugguer ce genre d'erreur car je les comprends pas souvent. ( ce qui n est pas le cas pour d autre type d erreur).

    En fait, maintenant il m'affiche une autre erreur de segementation pour le meme la mm fonction mais cette fois au niveau de strcmp(). Merci

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    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 486
    Par défaut
    Citation Envoyé par Msakeni Voir le message
    En fait, maintenant il m'affiche une autre erreur de segementation pour le meme la mm fonction mais cette fois au niveau de strcmp(). Merci
    Si tu ne sais pas ce qui te bloque, il faut faire le bilan de ce qu'il te manque. En l'occurrence, c'est strcmp() qui te pose problème. Cette fonction reçoit deux pointeurs de chaîne, lit ces chaînes en parallèle et s'arrête à la première différence, ou si les chaînes se terminent toutes deux, en même temps, par '\0'. Donc, il n'y a que trois possibilités :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    strcmp(tab[i].auteur, auteur)

    • Soit « tab[i].auteur » (premier paramètre) n'est pas initialisé et pointe n'importe où. Ta fonction va donc lire n'importe quoi ;
    • Soit « auteur » (second paramètre) n'est pas initialisé et pointe n'importe où. Ta fonction va donc lire n'importe quoi ;
    • Soit tes chaînes ne sont pas terminées par des '\0'. La lecture ne s'arrêtera donc pas et la fonction va sortir de la zone mémoire allouée.


    Dans les deux premiers cas, il vaut vérifier la fonction appelante. Celle qui invoque recherche_auteur() et vérifier la validité des paramètres qu'elle lui transmet.

    Pour le premier en particulier, soit c'est tab qui est invalide, soit tab pointe un tableau de structure qui est bien alloué, mais dont les structures ne contiennent rien. N'oublie pas que − de la même façon que « livre » contenait une valeur invalide − allouer de la place en mémoire (avec malloc() ou dans la pile avec des variables locales) réserve la place mais ne la remet en aucun cas à zéro.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 31
    Par défaut
    oui c'est vrai j ai trouvé que tab[i].auteur est NULL lors du test ou il m affiche l erreur de segmentation.
    MErci Obsidian.

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

Discussions similaires

  1. Erreur segmentation
    Par hornov dans le forum C
    Réponses: 6
    Dernier message: 18/02/2007, 01h02
  2. chaine de caractères , erreur segmentation
    Par psgman113 dans le forum C
    Réponses: 17
    Dernier message: 19/01/2007, 17h51
  3. erreur segmentation java
    Par dj cediorko dans le forum Langage
    Réponses: 1
    Dernier message: 31/12/2006, 12h30
  4. erreur de realloc
    Par Mr_Chut dans le forum C
    Réponses: 5
    Dernier message: 09/07/2006, 01h42
  5. [erreur] Segmentation fault
    Par fveysseire dans le forum C
    Réponses: 11
    Dernier message: 15/06/2006, 14h44

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