如何在C中尝试进行RPN时修复Segmentation Fault

时间:2019-05-13 19:24:50

标签: c rpn

我正在尝试制作一个使用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

1 个答案:

答案 0 :(得分:1)

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

之后,在push中,您尝试通过*t取消引用空位置。在这里您会遇到细分错误。