if语句和分段错误 - C++

3

我有一个 if/else if 语句,看起来像这样:

if(myNode->left->is_red){
    //CODE TO EXECUTE
}               
else if(myNode->right->is_red){
    //CODE TO EXECUTE
}

我正在检查的条件是每个节点中是否设置了某些数据字段。但问题是,如果我访问一个空指针并尝试访问它的成员(这些成员不存在),则会遇到分段错误问题。但是,如果在if语句之前,以及else if之前再次进行if语句,以检查节点是否为NULL,则会失去使用if / else if语句的能力。
有没有办法解决这两个问题?
2个回答

6

在 if 语句中检查指针是否不为空:

if(myNode != NULL && myNode->left != NULL && myNode->left->is_red){
{ 
   // code goes here
}

1
@Jordy,注意这是首选方法,并且将起作用,因为在使用&&(AND)逻辑时进行了短路处理。您可能需要考虑一下是否希望在指针为NULL的情况下具有不同的行为,在这种情况下,您可以使用嵌套的if语句。 - MartyE

5
我猜测问题在于left和/或right为空,因此出现了段错误吗?
如果是这样,请使用AND。
例如:
if((myNode->left != NULL) && myNode->left->is_red){
    //CODE TO EXECUTE
}               
else if((myNode->right != NULL) && myNode->right->is_red){
    //CODE TO EXECUTE
}

这里使用了短路求值:虽然myNode->left->is_redmyNode->right->is_red仍在if条件中,但如果myNode->leftNULL(或分别为myNode->right),它们将不会被计算,因此不会出现段错误。


是的!谢谢你!我不确定如何在同一条语句中完成它。这帮了我很大的忙! - jordan
@Jordy:我真的很高兴。ryanbwork的答案有帮助吗? - Mac
是的,它们都很有帮助。我给两个答案点了赞,但是看到了你的回答先,所以我接受了你的答案。 - jordan
@Jordy:好的,这样也挺公平的。考虑到两个答案基本上是一样的,只不过他的回答比我的提前了大约30秒,我只是想确保你在接受答案之前做出了明智的决定。听起来似乎是这样,所以谢谢! - Mac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接