首页 > 解决方案 > 结构指针相互覆盖

问题描述

我有一个功能:

    void initGraph(node_t *node, const int orderedInputNodes[]) {
    int index;
    
    for (int i = 0; i < S * 2; i++) {
        if (orderedInputNodes[i] == node->number) {
            index = i % 2 == 0 ? i + 1 : i - 1;

            node_t newNode;
            newNode.number = orderedInputNodes[index];
            newNode.left = EMPTY;
            newNode.right = EMPTY;

            if (node->left == EMPTY) {
                node->left = &newNode;
            }
            else if (node->right == EMPTY) {
                node->right = &newNode;
            }
        }
    }
    .
    .
    .
}

每次我找到我创建的相应数字newNode时,将其值分配给它并将其传递给左侧或右侧,但是,当代码到达分配右孩子的部分时,左孩子会被覆盖。怎么会这样?我想通过声明node_t newNode;一个全新的节点将自动创建。

标签: c++

解决方案


我想通过声明 node_t newNode; 将自动创建一个全新的节点。

正确的。问题是新节点可以替换旧节点。考虑:

 for (int j = 0; j < 1000; ++j)
 {
     int i;
     i = 3;
 }

您不会认为在此循环运行后,仍有一千个实例i仍然存在,是吗?每次运行这段代码时,i都会创建一个新代码。但是每次运行这段代码时,i上一次迭代中的那个就不再存在了,因为它超出了范围。

你有:

    {
        node_t newNode; // newNode is created here
        newNode.number = orderedInputNodes[index];
        newNode.left = EMPTY;
        newNode.right = EMPTY;

        if (node->left == EMPTY) {
            node->left = &newNode; // you save a pointer to it here
        }
        else if (node->right == EMPTY) {
            node->right = &newNode;
        }
    }
          // but newNode doesn't exist anymore here

所以你保存了一个指向不再存在的对象的指针。它最终指向存储在该内存中的任何内容,可能newNode是在循环中的下一次通过时创建的下一个。

不要存储指向本地对象的指针。

更新:您说您正在使用 C++ 进行编码。那你为什么要使用原始指针呢?您真的要手动管理对象的生命周期吗?C++ 有很棒的工具可以让这变得简单,比如std::unique_ptr.


推荐阅读