Bonjour,
Mon problème est des plus basiques, mais pour une raison que je ne saisie pas, peut-être due à l'heure "tardive", je n'arrive pas à le résoudre.
J'ai une liste chaînée, que je veux convertir en tableau, ou plus exactement deux tableau ; un étant en **char (crée puis donné en return), et l'autre en *int (passé par adresse).
La fonction:
Son appel:
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 char **lst_to_arr(t_ls_list *root, int **mt, int *len) { t_ls_list *crawler; char **ret; int i; *len = 0; if (!root) return (0); crawler = root; *len = lst_size(root); if (!(ret = malloc(sizeof(char*) * *len)) || !(*mt = malloc(sizeof(int) * *len))) return (0); printf("len of %d\n", *len); i = 0; while (i < *len) { ret[i] = strdup(crawler->name); printf("%d at %d\n", crawler->mtime, i); *mt[i] = 12; //crawler->mtime printf("check\n"); crawler = crawler->next; ++i; } return (ret); }
(tls->targetsmt & tls->dirsmt n'étant pas malloc)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 tls->targetsc = lst_to_arr(tls->targets, &tls->targetsmt, &tls->targetslen); tls->dirsc = lst_to_arr(tls->dirs, &tls->dirsmt, &tls->dirslen);
Ma struct:
J'ai essayé d'ouvrir gdb pour mieux comprendre ce qu'il se passait, mais j'ai plus été perturbé qu'autre chose:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 typedef struct s_ls_list { char *name; int mtime; struct s_ls_list *next; } t_ls_list;
Mon programme segfault effectivement au deuxième appel (*mt[1] => cannot acces memory ...), cependant, j'ai essayé *mt[1] et *(*mt+1), et ce dernier fonctionne! les deux expression ne sont-elles pas censées revenir au même?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 (gdb) print *mt[0] $1 = 0 (gdb) print *mt[1] Cannot access memory at address 0x0 (gdb) print *mt[2] Cannot access memory at address 0x16 (gdb) print *(*mt+0) $2 = 0 (gdb) print *(*mt+1) $3 = 0 (gdb) print *(*mt+2) $4 = 0
Je suppose donc que j'ai dû rater mon malloc, n'ayant pas trop l'habitude avec les *int, et encore moins non malloc'd et passées par adresse, mais tout de même, je n'arrive pas à localiser mon erreur.
Merci d'avance pour votre temps & vos réponses éventuelles.
Bonne soirée.
Partager