在 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);
第一个代码按预期工作。我正在尝试在结构内部使用双指针。
#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);