第一段代码按预期工作。我试着用结构内部的双指针来工作。
#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之后得到随机值。这不仅限于double-pointer,而且如果只访问一次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发布于 2021-07-01 14:00:57
在非构造函数版本中,t.node保存root的地址。
t.node = &root;在构造函数版本中,t.node保存temp的地址,这确实是临时的。一旦dangling pointer不再存在,它就会变成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);https://stackoverflow.com/questions/68211433
复制相似问题