Динамический стек, stack_top в C
Я немного потренировался с использованием динамических стеков, но застрял в том моменте, когда при попытке распечатать содержимое всего стека, я получаю дамп памяти.
stack.c (pila.c)
void PILA_Crea(Pila *pP){ //stack create
(*pP) = NULL;
}
int PILA_Buida(Pila p){ //stack empty
return (p == NULL);
}
int PILA_Plena(Pila p){ //stack full
return 1;
}
int PILA_Top(Pila p){ //stack top
if(p == NULL) {
//ERROR (PILA BUIDA)
return -1;
}else{
return (*p).element;
}
}
void PILA_Push(Pila *pP, int element){ //stack push
Node *pAux = (Node *) malloc(sizeof(Node));
if(pAux == NULL) {
//Memoria KO
}else{
pAux->element = element;
pAux->pSeguent = (*pP);
(*pP) = pAux;
}
}
void PILA_Pop(Pila *pP){ //stack pop
Node *pAux;
if(*pP == NULL){
//ERROR (PILA BUIDA)
}else{
pAux = (*pP);
(*pP) = pAux->pSeguent;
free(pAux);
}
}
void PILA_Destrueix(Pila *pP){ //stack free
free(pP);
(*pP) = NULL;
}
stack.h (pila.h)
typedef struct sNode{
int element;
struct sNode *pSeguent;
}Node;
//PILA
typedef Node * Pila;
void PILA_Crea(Pila *pP);
void PILA_Push(Pila *pP,int element);
int PILA_Top(Pila p);
int PILA_Plena(Pila p);
int PILA_Buida(Pila p);
void PILA_Pop(Pila *p);
void PILA_Destrueix(Pila *pP);
#endif
Использование PILA_Top() в
main.c
while(!flag){
if(!PILA_Buida(p)){
cont++;
printf("%d\n ",PILA_Top(p));
printf("%d-",cont);
PILA_Pop(&p);
}else{
flag=1;
}
}
и ошибка, которую я получаю
...
50-9
51-11
52-1936285535
*** glibc detected *** prac3: free(): invalid pointer: 0x080482d2 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b161)[0xb76ec161]
/lib/tls/i686/cmov/libc.so.6(+0x6c9b8)[0xb76ed9b8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0xb76f0a9d]
prac3[0x8048c89]
prac3[0x8048830]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb7697bd6]
prac3[0x8048531]
======= Memory map: ========
08048000-08049000 r-xp 00000000 00:17 1318400 /users/home/alumnes/LS/ls28996/Apuntes/Laboratorio/Practica_3/prac3
08049000-0804a000 rw-p 00001000 00:17 1318400 /users/home/alumnes/LS/ls28996/Apuntes/Laboratorio/Practica_3/prac3
08bee000-08c0f000 rw-p 08bee000 00:00 0 [heap]
b7500000-b7521000 rw-p b7500000 00:00 0
b7521000-b7600000 ---p b7521000 00:00 0
b766c000-b7679000 r-xp 00000000 08:01 757409 /lib/libgcc_s.so.1
b7679000-b767a000 r--p 0000c000 08:01 757409 /lib/libgcc_s.so.1
b767a000-b767b000 rw-p 0000d000 08:01 757409 /lib/libgcc_s.so.1
b7680000-b7681000 rw-p b7680000 00:00 0
b7681000-b77d4000 r-xp 00000000 08:01 757562 /lib/tls/i686/cmov/libc-2.11.1.so
b77d4000-b77d6000 r--p 00153000 08:01 757562 /lib/tls/i686/cmov/libc-2.11.1.so
b77d6000-b77d7000 rw-p 00155000 08:01 757562 /lib/tls/i686/cmov/libc-2.11.1.so
b77d7000-b77da000 rw-p b77d7000 00:00 0
b77dd000-b77e1000 rw-p b77dd000 00:00 0
b77e1000-b77e2000 r-xp b77e1000 00:00 0 [vdso]
b77e2000-b77fd000 r-xp 00000000 08:01 757429 /lib/ld-2.11.1.so
b77fd000-b77fe000 r--p 0001a000 08:01 757429 /lib/ld-2.11.1.so
b77fe000-b77ff000 rw-p 0001b000 08:01 757429 /lib/ld-2.11.1.so
bff30000-bff45000 rw-p bffea000 00:00 0 [stack]
53-Aborted (core dumped)
Значения от 1 до 51 верны, значение 52 не существует и 53 не должно отображаться.