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

求排查:C语言栈Push实现代码无报错无输出的原因

代码问题分析

核心问题:野指针非法访问

在main函数中,struct Stack *s仅声明了一个指针,但未为其分配内存或指向有效的Stack结构体实例。直接通过s->size、s->top、s->arr访问和赋值属于野指针解引用,这会触发未定义行为——程序可能静默崩溃、无输出,或出现诡异的运行结果,这就是代码既无报错也无输出的根本原因。

其他问题

  • 结构体冗余字段:struct Stack中的int data字段完全多余,栈元素存储在arr数组中,该字段无实际作用。
  • Push函数无边界检查:push函数直接执行top++并赋值,未判断栈是否已满(top >= size - 1),栈满时继续push会导致数组越界,同样属于未定义行为。
  • 无输出逻辑:代码全程没有printf这类输出语句,即便逻辑正常也不会产生任何输出内容。
  • Malloc返回值未校验:malloc可能因内存不足返回NULL,代码未处理这种情况,会导致后续访问arr时出错。

修复示例

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

typedef struct Stack{
    int size;
    int top;
    int *arr;
} Stack;

void push( Stack*s ,  int data)
{
    if (s->top >= s->size - 1) {
        printf("栈已满,无法执行push操作\n");
        return;
    }
    s->top++;
    s->arr[s->top] = data;
}

int main()
{
    // 为Stack结构体分配内存
    struct Stack *s = (Stack*)malloc(sizeof(Stack));
    if (s == NULL) {
        printf("结构体内存分配失败\n");
        return 1;
    }
    s->size = 100;
    s->top = -1;
    s->arr = (int* ) malloc (s->size* sizeof(int));
    if (s->arr == NULL) {
        printf("栈数组内存分配失败\n");
        free(s);
        return 1;
    }
    push( s, 180);
    // 添加输出验证push结果
    printf("push成功,当前栈顶元素:%d\n", s->arr[s->top]);
    
    // 释放内存避免泄漏
    free(s->arr);
    free(s);
    return 0;
}

内容的提问来源于stack exchange,提问作者Tanya shankar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:05:38