【发布时间】: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->s[stk->top] = c; -
@AndreasWenzel 我确实尝试使用指针访问运算符重写我的整个代码,例如
stk->s[stk->top] = c;但它仍然给我一个分段错误。也没有真正的变量我必须监视,而只是将字符添加到堆栈并向后打印它们。打印部分没有发生 -
为什么这个 ->
int top = EMPTY;?因为这个top变量,你会得到Stack Underflow。相反,您应该使用struct stack中定义的堆栈的top。
标签: c