Segmentation fault

Fermé
safasahnoun - 14 nov. 2012 à 17:08
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 - 14 nov. 2012 à 23:06
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

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
14 nov. 2012 à 17:17
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
safasahnoun
14 nov. 2012 à 17:23
j' ai corrigé mais le probmème de segmentation rest !
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
14 nov. 2012 à 17:29
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
14 nov. 2012 à 17:50
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
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
14 nov. 2012 à 23:06
... 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