指针参数在不应该变为空指针时变为空指针

时间:2014-06-22 14:03:44

标签: c++ pointers methods

我有一个函数,它接受一个结构

的指针
node *found = nbitree.findnode(nbitree.base_node, 15);

' nbitree.base_node'是什么成为0x0指针。我有一种感觉我没有正确处理这个指针,但我不知道如何解决它。

nbitree.base_node的创建如下:

struct node {
    int load;
    node *parent{0};
    node *left{0};
    node *right{0};
};

//...in the Bitree class

base_node = new node;

将函数声明为

node *Bitree::findnode(node *nd, int value){
    if (nd->load == value){
        return nd;
    } else if (findnode(nd->left, value) != 0){
        return findnode(nd->left, value);
    } else if (findnode(nd->right, value) != 0){
        return findnode(nd->right, value);
    }
    return 0;
}

我调试了代码并填充了base_node并保存了一个有效的指针,但每当我尝试复制它或传递它时,我得到一个空指针。此代码编译时没有任何错误或警告。

展开

  • 之前编辑了代码以扩展findnode函数
  • 当程序尝试检查if语句'(nd-> load == value)'
  • 时程序崩溃
  • 使用-O0标志
  • 进行编译

1 个答案:

答案 0 :(得分:2)

我注意到的一件事:这段代码:

node *Bitree::findnode(node *nd, int value){
    if (nd->load == value){
        return nd;
    } else if (findnode(nd->left, value) != 0){
        return findnode(nd->left, value);
    } else if (findnode(nd->right, value) != 0){
        return findnode(nd->right, value);
    }
    return 0;
}

有冗余函数调用。您重新运行找到该节点的树分支中的查找。更好的方法是跟踪结果,这样您只需在子树上调用findnode一次:

node *Bitree::findnode(node *nd, int value){
    if (nd->load == value) return nd;
    node* f = findnode(nd->left, value);
    if(f) return f;
    return findnode(nd->right, value);
}

当然,如果您的节点值按树排序存储,就像在大多数二叉树中一样,您不需要尝试两个分支,并且实际上会获得O(logN)性能:

node *Bitree::findnode(node *nd, int value) {
    while(nd) {
        if(nd->load == value) return nd;
        if(nd->load < value) nd = nd->left;
        else nd = nd->right;
    }
    return 0;
}