在 C++ 中使用构造函数时结构数据发生变化

Structure data changes when using constructor in C++

第一个代码按预期工作。我正在尝试在结构内部使用双指针。

#include "bits/stdc++.h"
using namespace std;

struct Node{
    int data;
    Node *left;
    Node* right;

    Node(int val) {
        data = val;
        left = right = NULL;
    }
};

struct Triplet{
    Node** node;
    int pval, lchild;
};

int main()
{
    Node *root = new Node(10);

    Triplet t;
    t.node = &root;
    t.pval = 1001;
    t.lchild = 2;
    cout << (*t.node)->data << " " << t.pval << " " << t.lchild << "\n";
    cout << (*t.node)->data << " " << t.pval << " " << t.lchild << "\n";
    cout << (*t.node)->data << " " << t.pval << " " << t.lchild << "\n";
    return 0;
}

以下是正确的预期输出

10 1001 2
10 1001 2
10 1001 2

但是当我尝试使用相同的逻辑但使用构造函数时,我会在调用第一个 cout 后获得随机值。这不仅限于 cout,而是如果 双指针 被访问一次,它将在下一次调用时改变。

#include "bits/stdc++.h"
using namespace std;

struct Node{
    int data;
    Node *left;
    Node* right;

    Node(int val) {
        data = val;
        left = right = NULL;
    }
};

struct Triplet{
    Node** node;
    int pval, lchild;
    Triplet(){}
    Triplet(Node* temp, int a, int b){
        node = &temp;
        pval = a;
        lchild = b;
    }
};

int main()
{
    Node *root = new Node(10);

    Triplet t(root, 1001, 2);
    cout << (*t.node)->data << " " << t.pval << " " << t.lchild << "\n";
    cout << (*t.node)->data << " " << t.pval << " " << t.lchild << "\n";
    cout << (*t.node)->data << " " << t.pval << " " << t.lchild << "\n";
    return 0;
}

异常输出:

10 1001 2
1878374340 1001 2
1878374340 1001 2

在您的非构造函数版本中,t.node 保存 root 的地址。

t.node = &root;

在您的构造函数版本中,t.node 保存了 temp 的地址,这确实是一个临时地址。一旦 temp 不再存在,它将变为 dangling pointer

node = &temp;

为了匹配您的非构造函数版本,您的构造函数需要采用 Node**.

struct Triplet{
    Node** node;
    int pval, lchild;
    Triplet(){}
    Triplet(Node** temp, int a, int b){
        node = temp;
        pval = a;
        lchild = b;
    }
};


int main()
{
    Node *root = new Node(10);

    Triplet t(&root, 1001, 2);