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 de segmentation (core dumped)


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 45
    Points : 32
    Points
    32
    Par défaut Erreur de segmentation (core dumped)
    J'ai un problème qui est survenu hier, quand ma première liste s'affiche, après le dernier élément (le 114ème)
    la console me met:
    Erreur de segmentation (core dumped)
    En cherchant sur internet, j'ai vu que cela venait d'un stack overflow peut-être...
    Comment puis-je corriger ma fonction pour ne plus avoir cette erreur de segmentation?

    ma fonction d'affichage pour rappel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    void afficher_Contenu_liste(Cellule* ptrl)
    {
          int count = 0;
          while (ptrl!=NULL)
        {
               fprintf(stdout,"Cellule %3d : %s\n",count++,ptrl->nom);
              ptrl = ptrl->suivante;
        }
    }
    Merci à tous de votre aide

  2. #2
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Si tu n'affiche même pas une ligne et que ta liste est bien chainée, c'est peut être un problème de "ptrl->nom" (ce pointeur n'est pas nul ?).

  3. #3
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    J'ai un problème qui est survenu hier, quand ma première liste s'affiche, après le dernier élément (le 114ème)
    Si le dernier élément s'affiche correctement, vérifie que tu n'as pas oublié de mettre ptrl->suivante à NULL pour celui-ci.
    Sinon, cette fonction semble correcte et ne doit pas provoquer de stack overflow. Le plantage vient peut-être de ce qui suit l'appel à la fonction.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par benja507 Voir le message
    J'ai un problème qui est survenu hier, quand ma première liste s'affiche, après le dernier élément (le 114ème)
    la console me met:

    En cherchant sur internet, j'ai vu que cela venait d'un stack overflow peut-être...
    Ca signifie qu'il y a un bug dans la fonction ou qu'il y a des donnée non ou mal initilisées
    Comment puis-je corriger ma fonction pour ne plus avoir cette erreur de segmentation?
    Ca n'a pas de sens. Ce qu'il faut trouver l'origine du bug. Avec le code que tu as donné ce n'est pas possible. La fonction elle même est correcte.

    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
     
    #include <stdio.h>
    typedef struct cellule
    {
       char const *nom;
       struct cellule *suivante;
    }
    Cellule;
     
    void afficher_Contenu_liste (Cellule * ptrl)
    {
       int count = 0;
       while (ptrl != NULL)
       {
          printf ("Cellule %3d : %s\n", count, ptrl->nom);
          count++;
          ptrl = ptrl->suivante;
       }
    }
     
    int main (void)
    {
       Cellule list[] = {
          {"A", list + 1},
          {"B", list + 2},
          {"C", list + 3},
          {"D", NULL},
       };
     
       afficher_Contenu_liste (list);
     
       return 0;
    }
    Donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Cellule   0 : A
    Cellule   1 : B
    Cellule   2 : C
    Cellule   3 : D
     
    Press ENTER to continue.
    Le problème est ailleurs.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre averti 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
    Points : 414
    Points
    414
    Par défaut
    utiliser un debugueur et il pointera sur la source de problème ??????/
    "La créativité est faites d'attention et de respect pour les petits faits de la vie."

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Points : 97
    Points
    97
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void afficher_Contenu_liste(Cellule* ptrl)
    {
          int count = 0;
          while (ptrl!=NULL)
        {
               fprintf(stdout,"Cellule %3d : %s\n",count++,ptrl->nom);
              ptrl = ptrl->suivante;
        }
    }
    Comme il est dit plus haut, ça n'a pas de sens. Il faudrait plus d'informations sur ton programme, notamment la déclaration de la variable que tu passes en paramètres à afficher_Contenu_liste() et son initialisation.
    Par ailleurs si tu travailles sur une liste, risque de te poser un problème...
    Stay in touch

  7. #7
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Citation Envoyé par oLie93 Voir le message
    Par ailleurs si tu travailles sur une liste, risque de te poser un problème...
    Pourquoi cela poserait un problème ?
    Il fait ce qu'il veut dans la fonction puisqu'il travaille sur une copie.
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par vicenzo Voir le message
    Pourquoi cela poserait un problème ?
    Il fait ce qu'il veut dans la fonction puisqu'il travaille sur une copie.
    où ?!
    Stay in touch

  9. #9
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par oLie93 Voir le message
    où ?!
    ptrl est une variable locale qui a reçu une copie de la valeur passée en argument au moment de l'appel de la fonction.
    Faire ptrl = ... ne modifie en rien l'argument passé à la fonction, seulement la variable locale.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  10. #10
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Citation Envoyé par oLie93 Voir le message
    où ?!
    Encore une fois, le C ne connait qu'UN seul type de passage de paramètres : passage par valeur.

    D'ou la copie de la variable passée à la fonction !
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par vicenzo Voir le message
    Encore une fois, le C ne connait qu'UN seul type de passage de paramètres : passage par valeur.

    D'où la copie de la variable passée à la fonction !
    C'est tout a fait juste...Je ne sais pas pourquoi je me suis entêter...il arrive souvent qu'on soit convaincu d'une chose, et finalement, avec du recul et l'insistance persuasive d'un groupe de personne, on ouvre soudain les yeux en s'exclamant "p*t%*#! mais que j'suis con !".

    Heureusement, l'erreur est humaine
    Stay in touch

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par oLie93 Voir le message
    Heureusement, l'erreur est humaine
    sed perseverare diabolicum est...

    Sort de ce corps Satan !
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Erreur de segmentation (core dumped)
    Par yansei dans le forum C
    Réponses: 13
    Dernier message: 07/06/2008, 11h51
  2. Erreur de segmentation (core dumped)
    Par mansour67 dans le forum wxWidgets
    Réponses: 3
    Dernier message: 05/03/2008, 18h11
  3. Réponses: 6
    Dernier message: 14/01/2008, 16h47
  4. erreur de segmentation core dumped
    Par panganino dans le forum Langage
    Réponses: 2
    Dernier message: 03/01/2008, 12h45
  5. Réponses: 5
    Dernier message: 04/11/2007, 13h39

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