求排查: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
相关产品推荐
相关产品推荐

