我不确定为什么我得到一个NULL指针取消引用错误

时间:2016-11-07 01:44:28

标签: c++ pointers

我一直在搞清楚为什么我会收到这个错误。以下是代码段:

int main() {
node *root = NULL;
char item1[6];
int item2;

in.open("input.txt");

while(in >> item1) {
    if(strcmp(item1, "delete") == 0) {
        in >> item2;
        cout << root->item << endl;
        if(!deleteLeaf(root, item2)) { // if deleteLeaf did not find(false)

        }
    }
    else {
        item2 = atoi(item1);
        Insert(root, item2);
        cout << root->item << endl;
    }
}

return 0;

}

我注意到的是,第一个cout << root->item << endl;被认为是空指针解除引用错误,但为什么不是第二个?我注意到,如果我也将cout << root->item << endl;更改为cout << root << endl;,我会获得两个不同的地址位置。这是Insert()的代码:

void Insert(node *&leaf, int item) {
    if(leaf == NULL) {
        leaf = new node;
        leaf->right = NULL;
        leaf->left = NULL;
        leaf->item = item;
    }
    else if(item < leaf->item) {
        Insert(leaf->left, item);
    }
    else {
        Insert(leaf->right, item);
    }
}

这是输入文件:

1
2
delete 3
4
5
6

对于后台,此代码应该从输入文件中读取并使用双向链表创建二叉树。如果我读到&#34;删除&#34;这个词,我需要搜索列表并删除项目(如果它存在),如果它没有那么我需要创建节点。我无法理解的是为什么cout&lt;&lt; root&lt;&lt; endl给了我两个不同的地址?

如果您需要更多信息,我很乐意提供。

编辑:我首先,我认为这是一个NULL指针引用错误,导致我为node *root获取两个不同的地址位置的问题,但实际上我将数组大小设置为6而不是7导致溢出意外地改变地址位置。谢谢你的帮助!

我仍然是stackoverflow的新手,所以我不确定如何将其标记为已解决...

1 个答案:

答案 0 :(得分:2)

由于最初你有node *root = NULL;并且没有为它分配任何东西,它将是空指针解除引用。请注意,您实际上可以打印root本身,无论如何都应该为您提供有效的内存地址。

我也不确定第二个&#34;你的意思。请澄清。

此外,您的商品数组的大小必须为7而不是6,因为&#39; \ 0&#39;终止性格。