我正在编写一个解析器,并且在进行转换时,我在正常的类类型和数组类类型之间出现问题。
有类似下面的内容对我有很大帮助:
if (expression causes segmentation fault)
do sth
else
do sth else
如果不是这样,那么将两个类彼此区分的好方法是什么?
if (base->type->GetType() != "") {
char *key = strcpy(key, base->type->GetType().c_str());
Node *node = (stack->front).Lookup(key);
if (node != NULL) {
theclass = dynamic_cast<ClassDeclaration *>(node);
}
if (!base->GetType()->IsEquivalentTo(GetType()))
errReport.FieldNotFoundInBase(field, type);*/
if (theclass->id->name){ // segfault happens here.
if (theclass->id->name) {
中,因为数组类实际上没有名称字段。我真的没有办法告诉正在初始化类变量的类型。答案 0 :(得分:3)
如果node
是ClassDeclaration
的实例,则dynamic_cast<ClassDeclaration *>(node)
会将node
“转换”为ClassDeclaration*
[1]。否则,它会返回0 (或者更确切地说,nullptr
会转为ClassDeclaration*
。
您不检查nullptr
值。取消引用nullptr
几乎肯定会出现段错误(虽然从技术上说它是UB,所以它可以做任何事情。)
现在,有可能会发生更深奥的事情并且因为dynamic_cast
失败并返回nullptr
而没有发生段错误,然后您继续取消引用该值。这是可能的。如果您检查了返回值,我们都知道。
注1:dynamic_cast
可能会更改指针值,例如,如果强制转换类型不是乘法继承对象的第一个基本类型。所以我可能不应该在“转换”这个词周围加上恐慌引用。