弹出堆栈的最后一个元素后程序崩溃

时间:2017-06-11 10:17:13

标签: c stack

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct node
{
    char data;
    struct node* link;
}   STACK_NODE;

void insert(STACK_NODE** p);
void print(STACK_NODE** p);
bool push(STACK_NODE** p, char in);
bool pop(STACK_NODE** p, char* out);

int main()
{
    STACK_NODE* myStackTop;
    insert(&myStackTop);
    print(&myStackTop);
    return 0;
}

void insert(STACK_NODE** p)
{
    char mychar;
    int NC,k;
    bool Mem;
    printf("how many charachters do you want to put in stack:");
    scanf("%d",&NC);
    for(k=0;k<NC;k++)
    {
        printf("enter character:-");
        scanf(" %c",&mychar);

        Mem=push(p,mychar);
        if(!Mem)
        {
            printf("ran out of memory or unknown error");
            exit(100);
        }
    }
}

bool push(STACK_NODE** p,char c)
{
    STACK_NODE* newNode;
    bool success;
    newNode = (STACK_NODE*)malloc(sizeof(STACK_NODE));
    if(!newNode)
    {
        success = false;
    }
    else
    {
        newNode->data=c;
        newNode->link=*p;
        *p=newNode;
        success = true;
    }
    return success;
}    

void print(STACK_NODE** p)
{
    char out;
    printf("contents of the stack:");
    while(pop(p,&out))
    {
        printf("%c",out);
    }
    return;
}

bool pop(STACK_NODE** p,char* c)
{
    STACK_NODE* Ndel;
    bool success;
    if(*p)
    {
        success = true;
        *c=(*p)->data;
        Ndel= *p;
        *p = (*p)->link;
    }
    else
        success = false;
    return success;
}

整个程序正常工作,直到最后一个元素从堆栈中弹出并打印出来。打印完最后一个字符后程序崩溃。我尝试通过在while块之后的print()方法定义中放置其他语句来调试它。我认为问题在于pop()函数定义中的if(* p)语句。 我检查了解决方案。但没有任何效果。

1 个答案:

答案 0 :(得分:3)

您需要将堆栈初始化为NULL

int main()
{
    STACK_NODE* myStackTop = NULL;

如果您没有,则在pop最后一个元素时,您将使用未初始化的值。

顺便说一句:在pop中,您似乎忘记了free(Ndel);