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

C语言栈结构体程序未返回peek()值却输出(null)

解决你的C语言栈程序输出(null)问题

嘿,刚学C语言就动手写栈,这点必须给你点个赞!不过你遇到的问题其实是C语言里很常见的值传递陷阱,再加上可能的输出格式错误,咱们一步步来捋清楚:

问题根源分析

  1. 值传递导致修改无效
    你写的push函数参数是struct stack stack,这意味着函数会创建一个原栈结构体的副本。你在函数里修改的只是这个副本的list和lastelement,主函数里的原栈完全没被改动!这就导致你主函数里的栈其实还是未初始化的状态,输出自然不对。

  2. 输出格式不匹配(导致(null))
    如果你的输出语句用了printf("%s", ...)来打印整数,就会因为格式符不匹配出现(null)——%s是用来打印字符串的,打印整数得用%d。

修正后的完整代码示例

#include <stdio.h>

struct stack {
    int list[256];
    int lastelement;
};

// 改成指针传递,操作原结构体
void push(struct stack *stack, int newelement) {
    // 先自增lastelement,再赋值(注意初始化时lastelement要设为-1)
    stack->lastelement++;
    stack->list[stack->lastelement] = newelement;
}

int main() {
    struct stack a;
    // 初始化栈:lastelement设为-1,表示当前没有元素
    a.lastelement = -1;
    
    push(&a, 123); // 传入栈的地址
    // 用%d打印整数,访问list[0]
    printf("list[0]的值是:%d\n", a.list[0]);
    
    return 0;
}

关键修改点说明

  • 指针传递:把push的参数改成struct stack *stack,调用时传&a(栈的地址),这样函数里的修改会直接作用在原结构体上。
  • 成员访问符:指针访问结构体成员要用->,而不是.,比如stack->lastelement。
  • 栈初始化:必须把lastelement初始化为-1,这样第一次push时自增到0,正好对应list[0]的位置。
  • 输出格式符:打印整数用%d,避免格式不匹配导致的奇怪输出。

现在你再编译运行这个代码,应该就能看到list[0]的值是:123的正确输出啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:06:18