【问题标题】:if statement and segmentation fault - c++if 语句和分段错误 - C++
【发布时间】:2012-12-14 01:55:52
【问题描述】:

我有一个 if/else if 语句,如下所示:

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

我检查的条件是是否设置了每个节点中的某些数据字段。但是,问题是,如果我访问 NULL 指针并尝试访问其成员(不存在),那么我会遇到分段错误问题。但是,如果我在 if 之前执行 if 语句,并在 else if 之前再次执行以检查节点是否为 NULL,那么我将失去使用 if/else if 语句的能力。

有什么办法可以解决这两个问题?

【问题讨论】:

    标签: c++ if-statement segmentation-fault treenode


    【解决方案1】:

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

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

    【讨论】:

    • @Jordy,请注意这是首选方法,因为使用&& (AND) 逻辑时会发生短路,所以它会起作用。如果指针是 NULL,您可能需要考虑是否需要不同的行为,在这种情况下,您可以使用嵌套的 if 语句。
    【解决方案2】:

    我假设问题是 left 和/或 right 为 NULL,因此您的段错误?

    如果是,则使用 AND。

    例如:

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

    这使用short-circuit evaluation:虽然myNode->left->is_redmyNode->right->is_red 仍然在if 条件中,但如果myNode->leftNULL(或分别为myNode->right),它们不会被评估,你会没有你的段错误。

    【讨论】:

    • 是的!谢谢!我不知道如何在同一个声明中做到这一点。这帮助很大!
    • @Jordy:我真的很高兴。 ryanbwork's answer 有帮助吗?
    • 是的。两者都很有帮助。我对两者都投了赞成票,但首先看到了您的答案。这就是我接受你的原因
    • @Jordy:好的,这很公平。鉴于两个答案说的基本相同,但他在我之前大约 30 秒被挤压,我只是想确保您在授予接受之前做出明智的决定。听起来好像是这样,所以谢谢!
    猜你喜欢
    • 2017-08-19
    • 2016-07-21
    • 2017-04-28
    • 2011-09-22
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 2017-05-29
    相关资源
    最近更新 更多