首页 > 解决方案 > 在 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

标签: c++constructoruser-defined-types

解决方案


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

t.node = &root;

在您的构造函数版本中,t.node保存 的地址temp,这确实是一个临时的。一旦不再存在,它就会变成一个悬空指针。temp

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);

推荐阅读