You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言栈操作代码持续报段错误,无法定位内存访问错误

自定义栈程序段错误修复

故障背景

程序目标为调用push等基础栈操作函数,实现以下逻辑:

  • 将目标字符串逐字符压入基于结构体实现的栈
  • 打印栈内所有字符
  • 输出反转后的字符串
    代码中混用.与->运算符访问栈结构体成员,编译后可正常打印原始字符串,随后触发段错误,报错提示为尝试解引用未初始化指针,运行环境无明确报错行定位。

根因定位

代码共有3处核心问题:

  1. 变量作用域冲突:额外定义了全局变量int top = EMPTY,但栈状态实际存储在stack结构体的top成员中。所有isFull、isEmpty、print、reverse、peek函数都在读写全局top,完全没有操作传入栈实例对应的top成员,栈状态判断完全错位。
  2. 局部变量未初始化:main函数中声明循环变量int i;后未赋初始值0,直接通过str[i]访问字符串内存。未初始化的局部变量存储栈上的随机垃圾值,直接访问会命中非法内存地址,是触发段错误的直接原因。
  3. 逻辑冗余不严谨: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:54:29