分段故障 - 核心转储

时间:2015-09-14 00:54:17

标签: c++

这是我的程序,使用堆栈将表达式从后缀转换为中缀。我没有错误,但在运行时,编译器说Segmentation Fault - Core Dumped。我认为这与指向垃圾值的指针有关。我如何跟踪这个流氓指针?另外,有没有更好的方法将postfix转换为中缀?

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<math.h>
class StringStack
{
    public:
    char arr[20][20];
    int top;
    StringStack()
    {top=-1; arr[20][20]={NULL};}
    void push(char* a)
    {strcpy(arr[++top],a);}
    char* pop()
    {return arr[top--];}
};
void paranthesise(char a[])
{
    int l = strlen(a);
    a[l+2] = '\0';
    for(int i=l; i>=0; i++)
        a[i] = a[i-1];
    a[0] = '(';
    a[l+1] = ')';

}
using namespace std;
int main()
{
    char temp[1];
    char postfix[20] = "";
    char temp2[10] = "";
    char temp3[10] = "";
    StringStack s1;
    cout<<"Enter Postfix Expression: "<<endl;
    gets(postfix); int l = strlen(postfix);
    for(int i=0; i<l;   i++)
    {
        if(postfix[i]!='*'&&postfix[i]!='/'&&postfix[i]!='+'&&postfix[i]!='-')
        {
            temp[0]=postfix[i];
            s1.push(temp);
        }
        else
        {
            strcpy(temp2,s1.pop());
            strcpy(temp3,s1.pop());
            switch(postfix[i])
            {
                case'*':
                    temp[0]='*'; break;
                case'/':
                    temp[0]='/'; break;
                case'+':
                    temp[0]='+'; break;
                case'-':
                    temp[0]='-'; break;

                default: cout<<"Error"; break;
            }
            strcat(temp3,temp);
            strcat(temp3,temp2);
            paranthesise(temp3);
            s1.push(temp3);
        }
    }
    strcpy(temp2,s1.pop());
    cout<<"\nInfix:";
    puts(temp2); 
    return 0;
}

1 个答案:

答案 0 :(得分:2)

我发现的问题:

<强>一

11

错了。这会将arr[20][20]={NULL}; 分配给NULL,这不是数组的有效元素。您正在设置您不应该的内存值。 arr[20][20]的有效元素为arr - arr[0][0]

这本身就足以让程序表现出未定义的行为。

我会将构造函数更改为:

arr[19][19]

<强>两个

使用时

StringStack() : arr{}, top(-1) {}

它可以容纳的唯一有效字符串是空字符串。由于您的意思是使用它来保存由一个字符组成的字符串,您需要使用:

char temp[1];

<强>三

char temp[2] = ""; // Doesn't have to be 2 but it has to be // greater than 1. 中,您有:

paranthesise

那需要:

for(int i=l; i>=0; i++)

否则,您将继续修改数组,而不会满足结束循环的标准。不仅如此,您最终还是将数组修改为超出有效限制。