C语言栈操作代码持续报段错误,无法定位内存访问错误
自定义栈程序段错误修复
故障背景
程序目标为调用push等基础栈操作函数,实现以下逻辑:
- 将目标字符串逐字符压入基于结构体实现的栈
- 打印栈内所有字符
- 输出反转后的字符串
代码中混用.与->运算符访问栈结构体成员,编译后可正常打印原始字符串,随后触发段错误,报错提示为尝试解引用未初始化指针,运行环境无明确报错行定位。
根因定位
代码共有3处核心问题:
- 变量作用域冲突:额外定义了全局变量
int top = EMPTY,但栈状态实际存储在stack结构体的top成员中。所有isFull、isEmpty、print、reverse、peek函数都在读写全局top,完全没有操作传入栈实例对应的top成员,栈状态判断完全错位。 - 局部变量未初始化:
main函数中声明循环变量int i;后未赋初始值0,直接通过str[i]访问字符串内存。未初始化的局部变量存储栈上的随机垃圾值,直接访问会命中非法内存地址,是触发段错误的直接原因。 - 逻辑冗余不严谨:
push操作前未做栈满判断,print/reverse/peek函数中包裹了无意义的while(1)死循环结构,存在逻辑隐患。
修复后完整代码
#include <stdio.h> #define MAX 1000 #define FULL (MAX - 1) #define EMPTY -1 typedef struct stack {char s[MAX]; int top;} stack; int isFull(stack *stk) { return stk->top == FULL ? 1 : 0; } int isEmpty(stack *stk) { return stk->top == EMPTY ? 1 : 0; } void reset(stack *stk) { stk->top = EMPTY; } void push(char c, stack *stk) { if(isFull(stk)) { printf("Stack overflow\n"); return; } stk->top++; stk->s[stk->top] = c; } char pop(stack *stk) { if(isEmpty(stk)) { printf("Stack underflow\n"); return '\0'; } return stk->s[stk->top--]; } void print(stack *stk) { if(isEmpty(stk)) { printf("Stack underflow\n"); return; } for(int i = 0; i <= stk->top; i++) { printf("%c\n", stk->s[i]); } printf("\n"); } void reverse(stack *stk) { if(isEmpty(stk)) { printf("Stack underflow\n"); return; } for(int i = stk->top; i >= 0; i--) { printf("%c", stk->s[i]); } printf("\n"); } char peek(const stack *stk) { if(isEmpty((stack*)stk)) { printf("Stack underflow\n"); return '\0'; } return stk->s[stk->top]; } int main() { stack stack_of_char; char *str = "i am otto am i"; int i = 0; reset(&stack_of_char); printf("original is: %s\n", str); while(str[i] != '\0') { push(str[i++], &stack_of_char); } print(&stack_of_char); reverse(&stack_of_char); return 0; }
修复说明
- 删除冗余全局
top变量,所有栈状态判断、修改都通过传入的栈指针操作对应结构体实例的top成员 main函数中循环变量i初始化为0,避免非法内存访问- 补全栈满、栈空的边界判断,移除无意义的死循环结构,保证栈操作逻辑严谨
内容的提问来源于stack exchange,提问作者Ibs
相关产品推荐
相关产品推荐

