【问题标题】:Pointer of struct changes结构更改的指针
【发布时间】:2018-12-19 15:44:57
【问题描述】:
#include<stack>
#include<iostream>

class Tree{
    private:
        struct tree{
            int val;
            tree * lChild;
            tree * rChild;
            tree * Parent;
        };
        tree *root;
    public:
        Tree();
        void insert(int x);
};

Tree::Tree(){
    root = NULL;
    std::cout<<"ROOT inside constructor : "<<root<<std::endl;
}

void Tree::insert(int x){
    tree *wst;
    wst->val = x;
    wst->lChild = NULL;
    wst->rChild = NULL;

    tree *temp = root;
    tree *p = NULL;


    std::cout<<"ROOT inside insert : "<<root<<std::endl;

    while(temp != NULL){
        p = temp;
        if(x < temp->val)
            temp = temp->lChild;
        else
            temp = temp->rChild;
    }

    std::cout<<x<<std::endl;

    wst->Parent = p;

    if(p == NULL){
        root = wst;
    }
    else{
        if(x < p->val)
            p->lChild = wst;
        else
            p->rChild = wst;
    }

}


int main(){
    Tree tree;

    tree.insert(404);

}

我想检查指针根是否等于 NULL,但这似乎不太有效。当我在方法插入中时,指针似乎从 0 变为 0x4。如何检查结构的指针是否等于 NULL?

编辑在插入方法中,如果树没有任何节点,则不应进入第一个while循环,因为root应该等于NULL。我的问题是它无论如何都会进入这个循环并在检查临时子代(仍未定义)时崩溃。

【问题讨论】:

  • "指针好像从 0 变成了 0x4" 你怎么知道?该方法中有两个couts,它们打印两个不同指针的值。输出是什么,你期待什么?
  • 我在类外看到了您的Tree 构造函数的定义,但我没有看到它的相应声明? ???也许你忘了改几个字?
  • @user463035818 我留下了错误的代码部分,我把它改成了它应该的样子。
  • 仅供参考,Tree tree = tree(); 不是有效的 C++。如果该行应该只是 Tree tree; 再问:发布一个 real minimal reproducible example 会产生您的问题,并清楚地解释预期与实际操作,否则这个问题注定要关闭.

标签: c++ null


【解决方案1】:

wst 指向什么?

tree *wst;
wst->val = x;
wst->lChild = NULL;
wst->rChild = NULL;
// [...]
wst->Parent = p;

哎呀!您的程序具有未定义的行为。难怪它会崩溃。 :)

你可能需要tree* wst = new tree();。不要忘记在Tree 析构函数中delete 你的节点!

我建议不要使用Tree 类型加上tree 类型;也许改用后者Node

【讨论】:

  • 请注意这个有问题的代码是如何被你隐藏的,直到修订版 #5;下次请提前提交minimal reproducible example(即第一次),这样我们就可以避免这个冗长的程序!
  • 这是一个错误,它不应该是指针,而是正常的结构。我将其更改为应有的样子,现在一切正常。这个不指向任何东西的指针是这个问题的原因。它以某种方式改变了根指针的值。
  • @NoName 不,它不能是一个普通的结构,它必须是一个指针(你必须初始化指针)。因为普通结构将在堆栈上创建并在函数结束后更改/删除。然后指针指向内存的某个部分,该部分已被其他函数覆盖。
  • Julo 所说的。如果要存储指向它的指针,则需要动态分配它。从它的声音来看,您已经取得了轻微的进步,但现在您的树中有一个悬空指针,实际上只是将问题移动到别处。
猜你喜欢
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多