簡體   English   中英

解除引用列表迭代器段錯誤

[英]Dereferenced list iterator segfault

我正在為bison / flex中的語言組合一個解析器,並且已經實現了抽象語法樹。 一旦我實現了一些非常原始的靜態類型檢查,我就開始在我的列表迭代器上得到分段錯誤,即迭代我的語句列表。

保存列表迭代器的根程序節點:

program::program(list<statement *> *stmtList) : stmts(stmtList) {}

void program::evaluate() {
   list<statement *>::iterator stmtIter;
   for (stmtIter = stmts->begin(); stmtIter != stmts->end();
      stmtIter++) {
     (*stmtIter)->evaluate();
  }
}

stmtList是指向語句指針列表的指針。 它必須是一個指向列表的指針,因為bison可以容納bison不接受在%union需要構造函數的類型

它失敗的語句節點的一個例子是

void declare_assign_stmt::evaluate() 
{
    reference * ref;
    ref->type = type;

    if(ref->type != exp->type)
    {
        cerr << "Incompatible types!" << endl;
    }
    else {
        ref->location = exp->evaluate();;
        idTable[id] = ref;
    };

}

reference是一個包含兩個字段的結構, typelocation ,字符串和int。 idTable是引用指針的id的映射。 exp是指向我的表達式節點的指針,它正確計算並返回一個int。 我已經完成了這個功能,一切都按預期運行,但是在完成evaluate() ,它將返回到迭代循環,即使列表中不包含更多元素,循環也會繼續,並且(*stmtIter)將在下一個點到沒有語句存在的位置,從而給出了分段錯誤。 報表評估中的任何內容都不會操縱列表。

一些見解會很棒。 謝謝!

reference * ref;
ref->type = type;

你沒有初始化那個指針。 編譯器應該真的警告你。 您是否啟用了所有可用的編譯器警告?

暫無
暫無

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

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