空指针问题?

时间:2009-11-23 05:03:22

标签: c++ null pointers

void Insert(AVLnode * & root, string X)
{
    if ( root == NULL)
    {
        root = GetNode(X);
    }
    else if ( root->info > X )
    {
        Insert(root->left,X);
        if ( height(root->left) - height(root->right) == 2 )
            if ( X < root->left->info )
                RotateRR(root);
            else
                RotateLR(root);
    }
    else if ( root->info < X )
    {
        Insert(root->right,X);
        if ( height(root->right) - height(root->left) == 2 )
            if ( X > root->right->info )
                RotateRR(root);
            else
                RotateLR(root);
    }
    root->height = max( height(root->left), height(root->right) )+1;
}
AVLnode* find(AVLnode* root,string X)
{
    if (!root) return 0;
    if ( root->info == X )
        return root;
    else if (root->info < X)
        find(root->left,X);
    else if (root->info > X)
        find(root->right,X);
    return 0;   
}
int main(int argc,char* argv)
{
    AVLnode* Dic;
    Insert(Dic,"adf");
    return 0;
}

第一次在Insert中,root为NULL,但在调试时,它会跳过root == null。发生了什么事?

3 个答案:

答案 0 :(得分:2)

问题出在AVLnode* Dic;的{​​{1}}声明中。您正在从main()insert()发送未初始化的指针。它包含垃圾值。将其初始化为main()

答案 1 :(得分:1)

第一次它不是NULL。变量在C ++中不会自动初始化为NULL或0;它们包含垃圾(无论它们占用的内存地址是什么)。

AVLnode* Dic;替换为AVLnode* Dic = NULL;,然后重试。

答案 2 :(得分:1)

“第一次插入”,在您提供的代码中,root是一个“随机”-ish值,因为您永远不会初始化Dic - 因此它可能恰好为NULL当你在没有调试器的情况下运行时,否则如果 使用调试器。这只是代码中的一个明确错误,因此在= 0正文的第一行;之前添加main。在此之后,您可能会发现更多错误(很难说,因为您没有向我们展示GetNodeRotate内容,即使您执行向我们展示{{ 1}}从未调用过的函数 - 特别是为了向我们展示代码的选择。