You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用另一个栈反转栈的C代码出现运行时错误(段错误)求助

栈反转代码的运行时错误与输出延迟问题排查及修复

核心段错误原因

  • 内存释放顺序完全错误:main函数末尾先执行free(s); free(reverse);,此时结构体指针已被释放为野指针,后续再访问s->arr和reverse->arr属于非法内存操作,直接触发段错误。正确顺序应为先释放结构体内部的动态数组,再释放结构体本身——因为结构体持有数组指针,结构体释放后数组指针会失效。

输出延迟原因

  • printf("how many elements you want to insert: ");无换行符,C语言中stdout默认是行缓冲模式,只有遇到\n或手动刷新时才会输出缓冲区内容,导致提示被暂存,直到后续操作才显示,造成“加载缓慢”的错觉。

潜在未定义行为

  • pop函数在栈空时仅打印提示,但未返回值,非void类型函数无返回值会触发未定义行为,可能导致后续逻辑异常。

修复后的完整代码

#include <stdio.h>
#include <stdlib.h>
typedef struct stack
{
    int top;
    int size;
    int *arr;
} fk;

fk *stackcreater()
{
    // 避免使用关键字new作为变量名
    fk *new_stack = (fk *)malloc(sizeof(fk));
    new_stack->size = 20;
    new_stack->arr = (int *)malloc(new_stack->size * sizeof(int));
    new_stack->top = -1;
    return new_stack;
}

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\n");
    }
    else
    {
        s->top++;
        s->arr[s->top] = data;
    }
}

int pop(fk *s)
{
    if (isempty(s))
    {
        printf("stack underflow\n");
        // 明确返回错误值,避免未定义行为
        return -1;
    }
    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: ");
        // 手动刷新缓冲,确保提示立刻显示
        fflush(stdout);
        scanf("%d", &n);
        // 增加非法输入判断,避免n为负数或0
    } while (n > s->size || n <= 0);
    
    for (int i = 0; i < n; i++)
    {
        push(s, i);
    }
    printf("Original stack: ");
    display(s);
    printf("\n");
    
    while (!isempty(s))
    {
        val = pop(s);
        push(reverse, val);
    }
    
    printf("Reversed stack: ");
    display(reverse);
    printf("\n");

    // 正确释放顺序:先释放内部数组,再释放结构体
    free(s->arr);
    free(reverse->arr);
    free(s);
    free(reverse);
    
    return 0;
}

内容的提问来源于stack exchange,提问作者Yash Sachdeva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:55:21