尝试在 C 中执行 RPN 时如何修复分段错误

How to fix Segmentation Fault while trying to do RPN in C

我正在尝试制作一个将使用 RPN 的程序,它将计算一系列整数。我有一些无法更改的标准函数(poppush)。但是当我 运行 下面的代码时,我得到了一个分段错误。

由于我无法更改这两个函数的内部核心,所以我尝试更改调用它们的方式(我将 stack[] 设为动态数组,将 top 设为int 指针)但没有任何变化。

#include <stdio.h>
#include <stdlib.h>
#define N 1000

void push(int stack[],int *t,int obj)
{
    if((*t)==(N-1))
    {
        printf("Stack overflow...\n");
        getchar(); //getc
        abort();
    }
    else
        stack[++(*t)]=obj;
}

int pop(int stack[],int *t)
{
    int r;
    if((*t<0))
    {
        printf("Stack empty...\n");
        printf("Error in expresion.\n");
        getchar(); //getc
        abort();           
    }
    else
        r=stack[(*t)--];
    return(r);
}

int isdigit(char in)
{
    int flag;

    if (in>=48 && in<=57)  //if its terminus 
        flag=1;
    else if(in==42 || in==43 || in==45 || in==47) //if its  operator
        flag=2;
    else 
        flag=0;

    return flag;
}

int main(int argc, char** argv) {

    int *stack=(int*) malloc(N*sizeof(int));
    char input;
    int i=0,*top=0,flag;
    int num1,num2;
    float result;

    if (stack == NULL) {
        printf("Out of memory!\n");
        return (1);
    }  
    printf("Give the Formula: ");
    while(input=getchar())
    {
        flag=isdigit(input);
        if(flag==1) //if its terminus 
        {
            push(&stack[i],top,input);
        }
        if(flag==2) //if its enforcer
        {
            num1=pop(&stack[i],top);
            num2=pop(&stack[i+1],top);
            if (input==42)   //case of +
                result=num1+num2;
            if (input==43) //case of *
                result=num1*num2;
            if (input==45) //case of -
                result=num2-num1;

            if (input==47) //case of /
                if(num2!=0) 
                    result=num2/num1;
                else
                    printf("Can't do the operation");
            push(&stack[i],top,result);
        }
        if(flag==0)  //case of everything else
        {
            printf("Error");
            exit(1);
        }
        printf("Operand: %c\n",input);
        //  for(int j=0;j<strlen(stack);j++)
        //   printf("stack[%d]=%d\n",i,stack[j]);
        //printf current status of stack

        i++;
    }   
    return (EXIT_SUCCESS);
}

如果你有一系列整数,如234+*,堆栈应该首先是2,3,4,+,*,其次是5,4,*,第三是20

main 中,您将 top 定义为指针并将其初始化为指向 null。

之后,在 push 中,您尝试通过 *t 取消引用空位置。此处出现分段错误。