Probleme liste simplement chaînée
Bonjour,
Suite à mon autre post, je me relance dans les listes simplement chaînées...
J'ai le fameux "erreur de segmentation", ce qui veut dire que j'accede à une zone de mémoire qui n'est pas pour mon programme, ceci probablement du à un mauvais usage d'un pointeur... :?
J'ai cherché jusqu'à très tard hier mais j'ai pas trouvé l'erreur :(
L'erreur intervient sur la fonction un élément :
Voici la structure :
Code:
1 2 3 4 5 6 7 8
|
typedef struct client
{
char *login;
char *passwd;
int fd;
struct client *suivant;
} client; |
Voici la fameuse fonction qui déraille :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
void ajouter_client (client** p, char log[16], char mdp[16], int fd)
{
client* new = malloc(sizeof (client));
new->login = log;
new->passwd = mdp;
new->fd = fd;
new->suivant = NULL;
(*p)->suivant = new;
} |
Son appel dans le main :
Code:
1 2 3 4 5 6 7 8 9 10 11
| #include "liste.h"
#include <stdio.h>
int main()
{
client *mes_clients = NULL;
ajouter_client(&mes_clients,"momo","toto",5);
return 0;
} |
J'espere que vous aurez des meilleurs yeux que moi ! :wink:
Merci pour vos réponses
Sorry
Re: Probleme liste simplement chaînée
Citation:
Voici la fameuse fonction qui déraille :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
void ajouter_client (client** p, char log[16], char mdp[16], int fd)
{
client* new = malloc(sizeof (client));
new->login = log;
new->passwd = mdp;
new->fd = fd;
new->suivant = NULL;
(*p)->suivant = new;
} |
Son appel dans le main :
Code:
1 2 3 4 5 6 7 8 9 10 11
| #include "liste.h"
#include <stdio.h>
int main()
{
client *mes_clients = NULL;
ajouter_client(&mes_clients,"momo","toto",5);
return 0;
} |
J'espere que vous aurez des meilleurs yeux que moi ! :wink:
Merci pour vos réponses
Sorry
Alors je peux me tromper mais :
tu passes en paramètre l'adresse de mes_clients
la valeur associé à cette adresse est NULL (variable initialisé comme ça)
Code:
(*p)->suivant = new;
donc là (*p) est NULL donc (*p)->suivant n'existe pas donc "segmentation fault"
ce qu'il faudrait mettre serais plutot
bien sur il faut à la base faire untest sur ton pointeur si il est NULL alors tu affecte simplement la valeur sinon tu affescte la valeur à *p->suivant
voila :)
en esperant ne pas m'être trompé
Re: Probleme liste simplement chaînée
Citation:
Envoyé par sorry60
Code:
1 2 3 4 5 6 7 8 9 10 11
|
void ajouter_client (client** p, char log[16], char mdp[16], int fd)
{
client* new = malloc(sizeof (client));
new->login = log;
new->passwd = mdp;
new->fd = fd;
new->suivant = NULL;
(*p)->suivant = new;
} |
Sinon pour eviter d'avoir a faire un test lors de l'insersion dans une liste chainee, le plus simple c'est (pardonnez moi mon pere) d'enfiler par l'avant :
Code:
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
#include <stdio.h>
#include <stdlib.h>
typedef struct client
{
char *login;
char *passwd;
int fd;
struct client *suivant;
} client;
void ajouter_client (client** p, char log[16], char mdp[16], int fd)
{
client* new;
new = malloc(sizeof(*new));
new->login = log;
new->passwd = mdp;
new->fd = fd;
new->suivant = *p; // tu places ton nouvel element devant l'actuel premier
*p = new; // il devient l'actuel premier
return;
}
int display_list(client *list)
{
client *current;
current = list;
while (current)
{
printf("%s, %s\n", current->login, current->passwd);
current = current->suivant;
}
return (0);
}
int main(void)
{
client *mes_clients;
mes_clients = NULL;
ajouter_client(&mes_clients,"Momo", "Toto",5);
ajouter_client(&mes_clients,"Delphine", "Talaron", 42);
ajouter_client(&mes_clients,"His_log", "His_passwd", 21);
ajouter_client(&mes_clients,"The_fourth_one", "xxxx", 84);
ajouter_client(&mes_clients,"Last", "youwillneverfindit", 31415);
display_list(mes_clients);
return (0);
} |