奇怪的分段错误

时间:2011-11-17 19:22:30

标签: c++

我一直在做的是反向抛光记谱计算器。我在编译程序时遇到了这个错误:

class Expression {
       protected:
                 string exp;
                 int value;
       public:
                 void getExp();//extract the exp from Expression
                 void setExp(string s);//store s in Expression
                 void setValue(int n);//store n in Expression
                 int evaluate();//extract the value from Expression
 };


 ...
 class binary : public Expression {
  public:
          void binaryyy(Expression *x1,Expression *x2,string op){
             if(op=="+"){
                 setValue(x1->evaluate()+x2->evaluate());
                 string x;
                 x.append(x2->getExp());
                 x.append("+");
                 x.append(x1->getExp());
                 setExp(x);
                }
             else if(op=="-"){
                 setValue(x1->evaluate()-x2->evaluate());
                 string x;
                 x.append(x2->getExp());
                 x.append("-");
                 x.append(x1->getExp());
                 setExp(x);
                }
             }
 };

然后在我的主要功能中:

 int main(){
  ...
  Expression *stack[10];
  int p=9,i;//p refers to one slot above the top element of the stack
  for(i=0;i<10;i++) stack[i]=NULL;
  ...
  string s_input;
  getline(cin,s_input);
  istringstream sss(s_input);

  while(!sss.eof() && p>-2){
  sss>>s;
  if(s=="+" || s=="-")
     binary *b = new binary;
     b->binary(stack[p+1],stack[p+2],s);
     stack[p+1]=NULL;
     stack[p+2]=b;
     p++;
  }
  else if(s.isNumber())//s.isNumber() might not exist.it means that s is number...
  {
     Expression *c=new Expression;
     istringstream ss(s);
     int temp;
     ss>>temp;
     c->setValue(temp);
     stack[p]=c;
     p--;
  }
  }
  ...

我已仔细检查过任何可能的非法分配或调用内存插槽以及所有内容.NO CLUE ......

PLUS:在这种情况下p不会超限。

4 个答案:

答案 0 :(得分:2)

int p=9,i;//p refers to the top of the stack

...

b->binary(stack[p+1],stack[p+2],s);
stack[p+1]=NULL;
stack[p+2]=b;

有一个超支。十元素数组中stack[p+1]stack[10]stack[p+2]stack[11]。您正在编写超出数组范围的内容(除非...包含正确调整p的代码,但我无法知道)。

修复该问题后,您需要初始化stack数组。目前,您有一个指向Expression的10个指针数组。它们都没有被初始化以指向任何有效的东西,而你后来取消引用它们。

也...

b->binary(...)

无法编译。

答案 1 :(得分:1)

首先,编译时启用所有警告并生成调试信息。在Linux上,这意味着g++ -Wall -g

然后,学会使用调试器(在Linux上,gdb或图形前端,如ddd)。

答案 2 :(得分:0)

stack可以保存10个指向Expression的指针,即从索引0到9.堆栈指针p从9开始,但在你的代码中,你说堆栈[p +1]和堆栈[p + 2],这两个都是非法索引的例子(它们分别转换为堆栈[10]和堆栈[11],它们是不存在的。)

答案 3 :(得分:0)

如果您使用的是linux,请查看我的回答here。它大约是valgrind,这个工具可以帮助您调试运行时问题。