c++ - 将指针传递给函数并修改它

标签 c++ function pointers

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 的本地拷贝,您并没有取消对它的引用以对它指向的对象进行操作,而是直接对本地指针本身进行操作。在函数内创建的 newed Node 将永远丢失。

您可以通过按引用传递指针来解决该问题。这不需要对您的代码进行任何其他修改:

void addNode(Node*& tree, int new_data)

其次,正如您所指出的,您正在取消引用 main 中的 NULL 指针。这只是未定义的行为 (UB)。可能发生的事情之一是崩溃。但是代码可以静默运行而不会崩溃。重要的事实是它是 UB,不能依赖该程序。

注意 1:如果您想要初始化您的 Node,使数据成员初始化为零,请使用值初始化:

Node* tree = new Node();

注意 2:使用原始 newed 指针时要非常小心。您的代码中已经存在一个 两个 资源泄漏。最好使用最合适的智能指针类型。

关于c++ - 将指针传递给函数并修改它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21570181/

相关文章:

c - 我不断收到此错误 : pointer value used where a floating point value was expected

c# - 从 C# 调用托管 C++ 函数

c++ - 语法平衡问题

android - 解释 Android 上执行的 Unix sleep() 函数的行为

c++ int指向数组指针数组的指针内存泄漏

css - 在 Stylus 中传递带参数的函数

c++ - 硬编码 HLSL 着色器

java - 调用随机函数

javascript - 过滤功能比较不工作javascript

c - 将一个链表插入另一个链表