stackoverflow 和 C/C++ 的新手。我正在努力实现二叉树并有一个简单的问题。假设我有以下内容:
struct Node {
int data;
Node* right_child;
Node* left_child;
};
void addNode(Node* tree, int new_data){
if(tree == NULL){
Node* new_tree = new Node;
new_tree->data = new_data;
new_tree->right_child = NULL;
new_tree->left_child = NULL;
tree = new_tree;
}
}
int main(){
Node* tree = new Node;
tree = NULL;
addNode(tree, 3);
cout << tree->data << endl; //CRASH
}
很简单吧。它会崩溃,因为树仍然是 NULL,即使在从 addNode 返回之后。我试图理解的是为什么一旦调用 addNode 就不会更新它。当然,指针的拷贝已被使用和更新,但它不应该仍然持有相同的地址吗?因此,还是更新原来的内存地址并返回。还是出于某种原因新指针指向了不同的位置?我对发生的事情感到困惑。任何帮助都会很棒。
此外,我只是在网站上编写了该代码 - 抱歉,如果有小错误,我并没有真正运行它。
谢谢。
最佳答案
有几个问题,
首先,您有一个指针 addNode
的本地拷贝,您并没有取消对它的引用以对它指向的对象进行操作,而是直接对本地指针本身进行操作。在函数内创建的 new
ed Node
将永远丢失。
您可以通过按引用传递指针来解决该问题。这不需要对您的代码进行任何其他修改:
void addNode(Node*& tree, int new_data)
其次,正如您所指出的,您正在取消引用 main
中的 NULL 指针。这只是未定义的行为 (UB)。可能发生的事情之一是崩溃。但是代码可以静默运行而不会崩溃。重要的事实是它是 UB,不能依赖该程序。
注意 1:如果您想要初始化您的 Node
,使数据成员初始化为零,请使用值初始化:
Node* tree = new Node();
注意 2:使用原始 new
ed 指针时要非常小心。您的代码中已经存在一个 两个 资源泄漏。最好使用最合适的智能指针类型。
关于c++ - 将指针传递给函数并修改它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21570181/