Динамический стек, 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 не должно отображаться.

0 ответов

Другие вопросы по тегам