使用另一个栈反转栈的C代码出现运行时错误(段错误)求助
栈反转代码的运行时错误与输出延迟问题排查及修复
核心段错误原因
- 内存释放顺序完全错误:
main函数末尾先执行free(s); free(reverse);,此时结构体指针已被释放为野指针,后续再访问s->arr和reverse->arr属于非法内存操作,直接触发段错误。正确顺序应为先释放结构体内部的动态数组,再释放结构体本身——因为结构体持有数组指针,结构体释放后数组指针会失效。
输出延迟原因
printf("how many elements you want to insert: ");无换行符,C语言中stdout默认是行缓冲模式,只有遇到\n或手动刷新时才会输出缓冲区内容,导致提示被暂存,直到后续操作才显示,造成“加载缓慢”的错觉。
潜在未定义行为
pop函数在栈空时仅打印提示,但未返回值,非void类型函数无返回值会触发未定义行为,可能导致后续逻辑异常。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> typedef struct stack { int top; int size; int *arr; } fk; fk *stackcreater() { // 避免使用关键字new作为变量名 fk *new_stack = (fk *)malloc(sizeof(fk)); new_stack->size = 20; new_stack->arr = (int *)malloc(new_stack->size * sizeof(int)); new_stack->top = -1; return new_stack; } int isfull(fk *s) { return (s->top == s->size - 1); } int isempty(fk *s) { return (s->top == -1); } void push(fk *s, int data) { if (isfull(s)) { // 加换行避免缓冲问题 printf("stack overflow\n"); } else { s->top++; s->arr[s->top] = data; } } int pop(fk *s) { if (isempty(s)) { printf("stack underflow\n"); // 明确返回错误值,避免未定义行为 return -1; } else { int val = s->arr[s->top]; s->top--; return val; } } void display(fk *s) { for (int i = 0; i <= s->top; i++) { printf("%d ", s->arr[i]); } } int main() { fk *s = stackcreater(); fk *reverse = stackcreater(); int n, val; do { printf("how many elements you want to insert: "); // 手动刷新缓冲,确保提示立刻显示 fflush(stdout); scanf("%d", &n); // 增加非法输入判断,避免n为负数或0 } while (n > s->size || n <= 0); for (int i = 0; i < n; i++) { push(s, i); } printf("Original stack: "); display(s); printf("\n"); while (!isempty(s)) { val = pop(s); push(reverse, val); } printf("Reversed stack: "); display(reverse); printf("\n"); // 正确释放顺序:先释放内部数组,再释放结构体 free(s->arr); free(reverse->arr); free(s); free(reverse); return 0; }
内容的提问来源于stack exchange,提问作者Yash Sachdeva
相关产品推荐
相关产品推荐

