Bonjour,
Je suis actuellement sur un projet de développement d'un Shell.
Afin de gérer les appels à CD/POPD/PUSH/DIRS, j'ai du faire une pile.
Donc j'ai essayé de m'inspiré de codes à droite à gauche, et apperement, quand on fait un pop, on doit faire un free pour supprimer l'élément.
Le problème c'est que lorsque je fais appel une deuxieme fois à popd, ca me sort l'erreur Double free or corruption (out).
D'après ce que j'ai vu, ca intervient quand on veut free 2 fois la meme zone mémoire, mais là je ne vois pas où je fais ça.
Quand je commente la ligne du free, ca me fait une erreur de compilation au deuxieme appel :/.
Voilà, je mets le code de ma Pile ici, si vous pouvez m'aider...
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
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 #include <stdio.h> #include <stdlib.h> #include "Pile.h" int stack_count(Pile **p_pile) { int i = 0; Pile *temporaire = (*p_pile)->precedent; if(p_pile != NULL) { while(temporaire != NULL) { i++; temporaire = temporaire->precedent; } } return i; } int stack_print(Pile **p_pile) { Pile *temporaire = (*p_pile)->precedent; if(p_pile != NULL) { fprintf(stdout,"%s ", (*p_pile)->donnee); while(temporaire->precedent != NULL) { fprintf(stdout,"%s ",temporaire->donnee); temporaire = temporaire->precedent; } fprintf(stdout,"\n"); } return 0; } int stack_push(Pile **p_pile, char *donnee) { printf("on rentre ici \n"); Pile *p_nouveau = malloc(sizeof *p_nouveau); if (p_nouveau != NULL) { p_nouveau->donnee = donnee; p_nouveau->precedent = *p_pile; *p_pile = p_nouveau; } return 0; } char *stack_pop(Pile **p_pile) { printf("on rentre dans pop \n"); char *ret; if (p_pile != NULL) { Pile *temporaire = (*p_pile)->precedent; ret = (*p_pile)->donnee; free(*p_pile), *p_pile = NULL; *p_pile = temporaire; } return ret; } char *stack_top(Pile *p_pile) { char *ret; /* Variable de retour */ if (p_pile != NULL) /* Si la pile n'est pas nulle */ { ret = p_pile->donnee; /* On stocke dans la variable ret, la valeur du dernier élément */ } return ret; }
Merci d'avance.
Nieli
N.B: Si vous avez besoin du reste du code, dites le moi.
Partager