C语言实现栈遇异常:Push函数相关字符串存在但未打印
解决C语言栈实现的Push函数问题及字符串打印异常
你在实现栈的Push操作和字符串打印时遇到的问题,我帮你一步步拆解和修复:
一、修复Push函数的核心问题
你的Push函数目前存在两个关键问题,直接导致栈无法正常工作:
- 指针传递方式错误:当前参数是
struct stackNode *topPtr,这是传值调用——函数内部修改topPtr只会改变局部变量,不会影响外部的栈顶指针。必须使用指针的指针(struct stackNode **topPtr),才能让函数真正更新外部的栈顶地址。 - 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
相关产品推荐
相关产品推荐

