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

C语言栈结构代码异常:无法正确反转数组求排查

问题排查与修复

你的代码核心问题在于反转数组时的下标错误,导致数据没有被写入到array_back的正确位置,甚至触发了数组越界的未定义行为。

具体原因分析

第一个for循环(用来把元素push进栈)结束后,变量i的值已经是6了(因为循环条件是i < 6,最后一次循环后i自增到6)。接下来的while循环直接用i++作为array_back的下标,这会把栈中pop出来的元素写到array_back[6]、array_back[7]这些超出数组范围的位置——但array_back的有效下标只有0到5(共6个元素)。

同时,while循环里的i < 10完全多余,既不符合数组长度,还可能导致更多越界问题。

修复方案

在进入while循环前,把i重置为0,让反转后的元素从array_back[0]开始写入:

int main()
{
    int i;
    int array_back[6];
    stack stack_to_build;
    int numbers[] = {4, 5, 6, 7, 8, 9};
    print_array_values(numbers, 6);
    reset(&stack_to_build);

    for(i = 0; i < 6; i++)
    {
        push(&stack_to_build, numbers[i]);
    }

    // 重置i为0,开始填充反转数组
    i = 0;
    while(!is_empty(&stack_to_build))
    {
        array_back[i++] = pop(&stack_to_build);
    }

    printf("reverse is:\n");
    print_array_values(array_back, 6);
    return 0;
}

额外优化建议(可选)

为了让栈操作更健壮,建议在push和pop时增加栈满/栈空的检查,避免非法操作:

  • 完善push函数:
void push(stack* stk, int a)
{
    if (is_full(stk)) {
        fprintf(stderr, "栈已满,无法执行push操作\n");
        return;
    }
    stk->top++;
    stk->data[stk->top] = a;
}
  • 完善pop函数:
int pop(stack* stk)
{
    if (is_empty(stk)) {
        fprintf(stderr, "栈已空,无法执行pop操作\n");
        return -1; // 这里可以根据需求定义错误返回值
    }
    return stk->data[stk->top--];
}

内容的提问来源于stack exchange,提问作者Pawlos Gher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:55:23