【问题标题】:Can't identify memory access error in code, keeps giving segmentation faults无法识别代码中的内存访问错误,不断出现分段错误
【发布时间】:2022-12-29 07:39:21
【问题描述】:

我曾尝试创建一个程序,该程序使用简单的堆栈函数(如 push)将语句的内容添加到堆栈中,然后从那里打印出每个字符,然后反转语句。我用过'。和“->”成员访问变量以更改基于结构的堆栈的内容。编译后它打印出原始语句,但之后它给出了一个分段错误,说我正在尝试取消引用一个未初始化的指针。有人可以指导我如何解决这个问题,因为它也没有说明我提出问题的路线。

#include <stdio.h>
#define MAX 1000
#define FULL (MAX - 1)
#define EMPTY -1

typedef struct stack {char s[MAX]; int top;} stack;
int top = EMPTY;

int isFull()
{
  if(top == FULL)
    return 1;
  else
    return 0;
}


int isEmpty()
{
  if(top == EMPTY)
    return 1;
  else
    return 0;
}


void reset(stack *stk)
{
  stk -> top = EMPTY;
}


void push(char c, stack *stk)
{
  stk -> top++;
  (*stk).s[(*stk).top] = c;
}


char pop(stack *stk)
{
  return (*stk).s[(*stk).top--];
}


void print(stack *stk)
{
  int i;
  while(1)
  {
    if(isEmpty())
    {
      printf("Stack underflow\n");
      break;
    }
    for(i = 0; i <= top; i++)
    {
      printf("%c\n", (*stk).s[i]);
    }
    printf("\n");
    return;
  }
}


void reverse(stack *stk)
{
  int i;
  while(1)
  {
    if(isEmpty())
    {
      printf("Stack underflow\n");
      break;
    }
    for(i = top; i >= 0; i--)
    {
      printf("%c", (*stk).s[i]);
    }
    printf("\n");
    return;
  }
}

char peek(const stack *stk)
{
  while(1)
  {
    if(isEmpty())
    {
      printf("Stack underflow\n");
      break;
    }
    return (*stk).s[(*stk).top];
  }
}


int main()
{
  stack stack_of_char;
  char *str = "i am otto am i";
  int i;
  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;
}

【问题讨论】:

  • 您是否尝试过在调试器中逐行运行代码,同时监视所有变量的值,以确定您的程序在哪一行停止按预期运行?如果你没有尝试过这个,那么你可能想读这个:What is a debugger and how can it help me diagnose problems?你可能还想读这个:How to debug small programs?
  • 打开编译器警告并注意它们。 godbolt.org/z/7cdev9ovM
  • 旁注:人们通常会这样写(*stk).s[(*stk).top] = c;而不是:stk-&gt;s[stk-&gt;top] = c;
  • @AndreasWenzel 我确实尝试使用指针访问运算符重写我的整个代码,例如stk-&gt;s[stk-&gt;top] = c; 但它仍然给我一个分段错误。也没有真正的变量我必须监视,而只是将字符添加到堆栈并向后打印它们。打印部分没有发生
  • 为什么这个 -> int top = EMPTY;?因为这个top变量,你会得到Stack Underflow。相反,您应该使用 struct stack 中定义的堆栈的 top

标签: c


【解决方案1】:

你的程序有几个问题。让我们从全局变量top开始。这会导致问题,因为一方面你有一个 stack 结构负责维护堆栈,并且它有自己的 top。但是你有这个你甚至没有在任何地方使用的全局。这几乎就像你添加它来解决你不理解的编译器错误一样;)

所以让我们放弃它,并修复你的堆栈函数。我正在重新排列 push 函数的参数,以便堆栈成为第一个参数。这有点更传统。

typedef struct stack {
    char s[MAX];
    int top;
} stack;

int isFull(stack *stk)
{
    return stk->top == FULL;
}

int isEmpty(stack *stk)
{
    return stk->top == EMPTY;
}

void reset(stack *stk)
{
    stk->top = EMPTY;
}

void push(stack *stk, char c)
{
    if (isFull(stk))
        return;
    stk->s[++stk->top] = c;
}

char pop(stack *stk)
{
    if (isEmpty(stk))
        return '
【解决方案2】:

如果没有初始化,整数将是一个随机值。这是内存访问错误的根本原因。

您将需要正确初始化变量。在主要功能中,而不是

int i;,

你应该使用

int i = 0;

假设您计划访问从索引0 开始的值。

【讨论】:

  • 在主函数中,否则,while(str[i] != '
猜你喜欢
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多