Segmentation fault

Bonjour,
J'ai fait un programme et lors de la compilation il me dit segmentation fault
voici la parti ou j' ai le problème:
typedef Pokemon p;
typedef struct maillon *Pokemon_list;
struct maillon {
p donnee;
Pokemon_list suivant;
};

//cette fonction va ajouter un pokemon (type que j'ai construit ) dans une liste :
Pokemon_list add(Pokemon_list liste, Pokemon p)
{Pokemon_list nouvelliste = malloc(sizeof(Pokemon_list));
nouvelliste->donnee = p;
nouvelliste->suivant = liste;
return nouvelliste;
}
//affichage
void get_pokemons_list(Pokemon_list a){
if (a== NULL) {printf ("liste vide");}
printf("[");
while (a->suivant != NULL)
{printf ("%s,",a->donnee.Nom);
a=a->suivant;}
printf("%s]",a->donnee.Nom);}

3 réponses

  1. Modérateur
    Il te manque un else :

    void get_pokemons_list(Pokemon_list a)
    {
        if (a==NULL)
            printf ("liste vide");
        else
        {
            printf("[");
            while (a->suivant != NULL)
            {
                printf ("%s,",a->donnee.Nom);
                a=a->suivant;
            }
            printf("%s]",a->donnee.Nom);
        }
    }

    On doit aussi pouvoir faire plus simplement :

    void get_pokemons_list(Pokemon_list a)
    {
        printf("[");
        for (;a!=NULL;a=a->suivant)
            printf ("%s,",a->donnee.Nom);
        printf("]");
    }
    0
    1. j' ai corrigé mais le probmème de segmentation rest !
      0
    2. Modérateur
      Il se peut alors que ce soit a->donnee qui vaille NULL et donc donnee.Nom qui plante, mais là c'est que ton code est mal fait au moment tu créés ta liste :

      void get_pokemons_list(Pokemon_list a)
      {
          printf("[");
          for (;a!=NULL;a=a->suivant)
              printf("%s,",(a->donnee==NULL) ? "NULL" : a->donnee.Nom);
          printf("]");
      }
      0
  2. Contributeur
    nouvelliste->donnee = p;
    nouvelliste->donnee est de type Pokemon.
    Où est réalisée l'allocation ? A moins que tu souhaites faire pointer nouvelliste->donnee vers p, mais dans ce cas, il faut mettre un type pointeur.
    0
    1. ... lors de la compilation il me dit segmentation fault
      Ce ne serait pas plutôt à l'exécution ? Sinon, que dit le compilateur ?

      voici la parti ou j' ai le problème
      Lorsqu'une erreur de programme entraîne une erreur de segmentation (99/100 un pointeur en galère (mal initialisé, utilisé après delete, ...)), il est loin d'être rare que la manifestation de cette erreur se fasse plus tard, voir beaucoup plus tard, voir pas du tout !
      Bonne continuation.
      0