C语言实现字符串栈问题:display功能无法正常运行求助
字符串栈代码修复方案
原代码的核心问题
- 未为栈中字符串分配内存:栈结构体里的
char *stack[100]是指针数组,但每个指针未指向有效内存空间,直接赋值会引发野指针错误,导致display功能无法正常工作。 - 字符串复制逻辑错误:push函数中
*(s->stack[s->top])=element;写法错误,且循环条件的'/0'是拼写错误,应为'\0'。 - 局部变量生命周期问题:
element是push函数的局部数组,函数执行完毕后内存会被释放,栈指针指向它会导致后续访问失效。 - 输出格式问题:printf字符串中的换行应使用
\n而非直接换行,避免编译警告或输出异常。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #define max 5 struct stack{ int top; char *stack[100]; }; typedef struct stack stack; void push(struct stack *s) { char element[20]; if (s->top == max-1) { printf("栈已满\n"); return; } else { s->top += 1; printf("请输入要入栈的元素\n"); scanf("%s", element); // 为当前栈元素分配内存,长度为字符串长度+1(存储终止符) s->stack[s->top] = (char*)malloc(strlen(element) + 1); if (s->stack[s->top] == NULL) { printf("内存分配失败\n"); s->top -= 1; // 恢复top,避免栈状态错误 return; } // 复制字符串到分配的内存中 strcpy(s->stack[s->top], element); } } void pop(struct stack *s) { if (s->top == -1) { printf("栈为空\n"); return; } else { printf("被删除的元素是:%s\n", s->stack[s->top]); free(s->stack[s->top]); // 释放字符串占用的内存,避免内存泄漏 s->top -= 1; } } void display(struct stack *s) { if (s->top == -1) { printf("栈为空\n"); return; } else { printf("元素如下:\n"); for (int i = 0; i <= s->top; i++) { printf("%s\n", s->stack[i]); } } } int main() { struct stack s; s.top = -1; int ch; for(;;) { printf("请输入你的选择\n"); printf("1.入栈\n"); printf("2.出栈\n"); printf("3.显示\n"); printf("4.退出\n"); scanf("%d", &ch); switch (ch) { case 1: push(&s); break; case 2: pop(&s); break; case 3: display(&s); break; case 4: // 退出前释放所有栈中元素的内存 while (s.top != -1) { free(s->stack[s.top]); s.top--; } goto a; break; default: printf("无效选择\n"); break; } } a: return 0; }
修复点说明
- 添加
#include <string.h>用于调用字符串操作函数strlen和strcpy。 - push函数中为每个栈元素分配独立内存,确保字符串数据不会随局部变量销毁而丢失。
- pop函数中释放出栈元素的内存,避免内存泄漏。
- main函数退出前释放所有剩余栈元素的内存,保证内存安全。
- 所有提示文本改为中文,输出格式统一使用
\n换行。
预期终端输出示例
请输入你的选择 1.入栈 2.出栈 3.显示 4.退出 1 请输入要入栈的元素 john 请输入你的选择 1.入栈 2.出栈 3.显示 4.退出 1 请输入要入栈的元素 maddy 请输入你的选择 1.入栈 2.出栈 3.显示 4.退出 3 元素如下: john maddy
内容的提问来源于stack exchange,提问作者Kshitij shettyyy
相关产品推荐
相关产品推荐

