[英]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
是一個包含兩個字段的結構, type
和location
,字符串和int。 idTable是引用指針的id的映射。 exp
是指向我的表達式節點的指針,它正確計算並返回一個int。 我已經完成了這個功能,一切都按預期運行,但是在完成evaluate()
,它將返回到迭代循環,即使列表中不包含更多元素,循環也會繼續,並且(*stmtIter)
將在下一個點到沒有語句存在的位置,從而給出了分段錯誤。 報表評估中的任何內容都不會操縱列表。
一些見解會很棒。 謝謝!
reference * ref;
ref->type = type;
你沒有初始化那個指針。 編譯器應該真的警告你。 您是否啟用了所有可用的編譯器警告?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.