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

C语言实现栈遇异常:Push函数相关字符串存在但未打印

解决C语言栈实现的Push函数问题及字符串打印异常

你在实现栈的Push操作和字符串打印时遇到的问题,我帮你一步步拆解和修复:

一、修复Push函数的核心问题

你的Push函数目前存在两个关键问题,直接导致栈无法正常工作:

  1. 指针传递方式错误:当前参数是struct stackNode *topPtr,这是传值调用——函数内部修改topPtr只会改变局部变量,不会影响外部的栈顶指针。必须使用指针的指针(struct stackNode **topPtr),才能让函数真正更新外部的栈顶地址。
  2. malloc语法不完整:你写的malloc(sizeof(struc...是未完成的代码,正确写法是malloc(sizeof(struct stackNode)),同时必须检查malloc的返回值(避免内存分配失败导致程序崩溃)。

修复后的完整Push函数代码如下:

#include <stdlib.h> // 必须包含malloc对应的头文件
#include "my.h"

void push(struct stackNode **topPtr, BizarreNumber_t info){
    // 分配新节点的内存空间
    struct stackNode *newTop = malloc(sizeof(struct stackNode));
    if (newTop == NULL) {
        printf("内存分配失败,无法完成Push操作!\n");
        return;
    }
    // 为新节点赋值数据
    newTop->data = info;
    // 新节点指向原来的栈顶
    newTop->nextPtr = *topPtr;
    // 更新栈顶指针为新节点
    *topPtr = newTop;
}

调用Push时,需要传入栈顶指针的地址,示例:

struct stackNode *stackTop = NULL;
BizarreNumber_t testNum = {"AB", 2, 100};
push(&stackTop, testNum);

二、排查字符串无法打印的异常

你的BizarreNumber_t结构体中char type[3]是长度为3的字符数组,而C语言中字符串必须以**'\0'(空字符)**结尾,才能被printf("%s")正确识别。如果赋值时没有添加这个终止符,就会出现打印异常(比如乱码、无输出)。

正确的赋值方式参考:

// 方式1:用strcpy赋值(字符串常量自带'\0')
BizarreNumber_t num;
strcpy(num.type, "AB"); // "AB"实际是'A'、'B'、'\0'三个字符,刚好适配type[3]

// 方式2:逐个字符赋值后手动添加终止符
num.type[0] = 'X';
num.type[1] = 'Y';
num.type[2] = '\0'; // 必须添加,否则printf会读取内存中随机内容

如果你的代码里没有处理type的终止符,这就是字符串无法打印的最可能原因。

额外提醒

  • 后续记得编写Pop函数,在释放节点时同时回收内存,避免内存泄漏。
  • 所有涉及内存分配的操作,都要养成检查返回值的习惯,防止意外崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:38:05