使用另一个堆栈反转堆栈,运行时错误

Reverse a stack using another stack, runtime error

提问人:Yash Sachdeva 提问时间:10/16/2023 最后编辑:mchYash Sachdeva 更新时间:10/16/2023 访问量:48

问:

#include <stdio.h>
#include <stdlib.h>
typedef struct stack
{
    int top;
    int size;
    int *arr;
} fk;
fk *stackcreater()
{
    fk *new = (fk *)malloc(sizeof(fk));
    new->size = 20;
    new->arr = (int *)malloc(new->size * sizeof(int));
    new->top = -1;
    return new;
}
int isfull(fk *s)
{
    return (s->top == s->size - 1);
}
int isempty(fk *s)
{
    return (s->top == -1);
}
void push(fk *s, int data)
{
    if (isfull(s))
    {
        printf("stack overflow");
    }
    else
    {
        s->top++;
        s->arr[s->top] = data;
    }
}
int pop(fk *s)
{
    if (isempty(s))
    {
        printf("stack underflow");
    }
    else
    {
        int val = s->arr[s->top];
        s->top--;
        return val;
    }
}
void display(fk *s)
{
    for (int i = 0; i <= s->top; i++)
    {
        printf("%d ", s->arr[i]);
    }
}
int main()
{
    fk *s = stackcreater();
    fk *reverse = stackcreater();
    int n, val;
    do
    {
        printf("how many elements you want to insert: \t");
        scanf("%d", &n);
    } while (n > s->size);
    for (int i = 0; i < n; i++)
    {
        push(s, i);
    }
    display(s);
    printf("\n");
    while (!isempty(s))
    {
        val = pop(s);
        push(reverse, val);
    }
    display(reverse);

    free(s);
    free(reverse);
    free(s->arr);
    free(reverse->arr);
    return 0;
}

我为新手反转堆栈而编写的这段代码,我认为这在某种程度上是有效的,因为当我在 VS Code 中运行它时,它需要一分钟才能加载,然后要求 n,而不是它应该在运行后立即要求它,我认为 VS 代码可能有问题,但没有, 我当时使用的在线编译器,它显示运行时错误,分段错误

阵列 C 堆栈 反向

评论

1赞 Gerhardh 10/16/2023
free(s->arr);释放内存后,不允许访问指向的内存。将该行移到 .相同。此错误的结果是未定义的行为,这可能会导致您观察到的分段错误。sfree(s);reverse
1赞 Gerhardh 10/16/2023
在某些情况下,编译器是否显示了一些关于不返回值的警告?pop
2赞 Gerhardh 10/16/2023
如果我使用固定的调用顺序运行您的代码,我会得到正确的结果,没有任何错误,并且立即要求我输入。除了释放之外,我看不出有什么问题。free

答: 暂无答案