Double free or corruption (out). Programmation d'une Pile.
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:
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.