簡體   English   中英

奇怪的分割錯誤

[英]weird segmentation fault

我一直在做的是反向拋光符號計算器。在下面編譯我的程序時遇到了這個錯誤:

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--;
  }
  }
  ...

我已經非常仔細地檢查了是否有任何可能的非法分配或調用內存插槽等所有問題。沒有線索...

PLUS:p在這種情況下不會溢出。

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數組。 當前,您有一個包含10個指向Expression指針的數組。 它們都沒有初始化為指向有效的任何東西,而您稍后取消引用它們。

也...

b->binary(...)

不會編譯。

首先,編譯所有啟用的警告並生成調試信息。 在Linux上,這意味着g++ -Wall -g

然后,學習使用調試器(在Linux, gdbddd類的圖形前端)上。

stack可以容納10個指向Expression s的指針,即從索引0到9。堆棧指針p從9開始,但是在您的代碼中,您說stack [p + 1]和stack [p + 2],這兩個都是非法索引的示例(它們分別轉換為不存在的stack [10]和stack [11])。

如果您使用的是Linux,請在此處查看我的答案。 它與valgrind有關,該工具可以幫助您調試運行時問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM