Segmentation fault
safasahnoun
-
loupius Messages postés 789 Statut Membre -
loupius Messages postés 789 Statut Membre -
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);}
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
-
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("]"); }-
-
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("]"); }
-
-
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. -
... 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.