解除引用列表迭代器段错误

时间:2013-10-31 03:21:46

标签: c++ list iterator segmentation-fault abstract-syntax-tree

我正在为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)接下来将指向不存在语句的位置,从而给出分段错误。报表评估中的任何内容都不会操纵列表。

一些见解会很棒。谢谢!

1 个答案:

答案 0 :(得分:2)

reference * ref;
ref->type = type;

您没有初始化该指针。编译器应该真的警告你。您是否启用了所有可用的编译器警告?

相关问题