为什么弹出堆栈中的最后一个元素会导致C中的分段错误?

rkjcb

我在C中创建堆栈操作,但是当我尝试弹出最后一个元素时,它导致SEGMENTATION FAULT

#include <stdio.h>
#include <stdlib.h>

typedef struct node1
{
    int data;
    struct node1 *link;
} node;

node *top,*header;

void push()
{
    node *temp = (node *)malloc(sizeof(node));
    printf("PUSH : ");
    scanf("%d", &temp->data);
    if (header == NULL)
    {
        top = temp;
        header = temp;
        temp->link = NULL;
    }

    else
    {
        temp->link = header;
        header = temp;
        top = temp;
    }
}

void pop()
{
    if (header == NULL)
        printf("Stack Empty");
    else
    {
        node *ptr = top;
        top = header = top->link;
        free(ptr);
    }
}

void display()
{
    node *ptr = header;
    while (1)
    {
        if (ptr->link == NULL)
        {
            printf("%d", ptr->data);
            break;
        }
        printf("%d", ptr->data);
        ptr = ptr->link;
        printf("->");
    }
    printf("\n\n");
}

int main()
{
    printf("\nSTACK :\n\n");
            while (1)
            {
                int choice;
                printf("1.Push 2. Pop  (Press ctrl + C to exit ): ");
                scanf("%d", &choice);
                switch (choice)
                {
                case 1:
                    push();
                    display();
                    break;

                case 2:
                    pop();
                    display();
                    break;

                default:
                    printf("Wrong Entry\n\n");
                }
            }

}

我知道一个类似的问题,在链表堆栈中的弹出功能导致分段错误-已问过C,但它对我没有帮助。为什么会发生此错误?问题是否与上述问题类似。

h0r53

段错误是由于您的显示功能。在显示功能中,您可以进行检查,if (ptr->link == NULL)但实际上应该进行检查if (ptr == NULL)如您所见,如果ptrNULL,则引用ptr->link将导致段错误。

在显示功能的while循环开始时,您可以尝试:if (ptr == NULL) break;更重要的是,请检查是否ptrNULL由于while条件:

void display()
{
    node *ptr = header;
    while (ptr)
    {
        if (ptr->link == NULL)
        {
            printf("%d", ptr->data);
            break;
        }
        printf("%d", ptr->data);
        ptr = ptr->link;
        printf("->");
    }
    printf("\n\n");
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么克隆最后一个元素在jQuery中不起作用?

为什么Java中的每个循环都不能访问最后一个元素?

为什么堆栈推送会导致分段错误?

为什么需要让孩子获得$(“ body”)中的最后一个元素

为什么此代码仅显示数组中的最后一个元素?

为什么关联容器中的end()元素与最后一个元素打印相同的值?

为什么在另一个头文件中声明结构会导致LNK2001错误?

为什么数组中的每个元素都会自动变成最后一个元素?

为什么Redis TimeSeries不能捕获聚合中的最后一个元素?

从C ++中的集合中删除最后一个元素

C ++ Linux:在类中声明数组会导致分段错误

尝试引用char *中的第一个元素时,C中出现分段错误

为什么awk split()使第一个字段成为数组中的最后一个元素?

我在双向链表中查找最后一个元素的代码抛出分段错误

为什么我的for循环会跳过数组中的最后一个值?

从C中的链表中弹出一个元素

为什么我只能引用传递给onClickListener的TextView数组中的最后一个元素

Ruby:为什么将Array中的最后一个元素更改为1?

链表堆栈中的弹出功能导致分段错误-C

为什么数组中的最后一个元素会覆盖所有先前的元素?

为什么strlen会导致C中的分段错误?

为什么mov rax,cr0会导致nasm 64位中的分段错误

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

C++ 为什么访问数组中的元素会返回一个指针?

在递归函数中调用另一个函数会导致错误。为什么?

为什么链表的最后一个元素没有出现在输出中?

为什么以下会导致分段错误?

不确定为什么 toupper() 会切断 C 中的最后一个字母

为什么我的代码输出中的第一个和最后一个值会翻倍?