C++ 意外的指针行为

C++ 意外的指针行为,c++,C++,我对下面的演示代码中到底出了什么问题感到困惑。我希望下一个会一直指向链中的下一个元素,直到到达末尾但是,我得到了EXE\u BAD\u ADESS错误。我想我在递归指针赋值中遗漏了一些东西 template <class T> struct Node { Node *left, *right, *parent; int height; T value; // constructor Node(T val) : value(val){

我对下面的演示代码中到底出了什么问题感到困惑。我希望下一个会一直指向链中的下一个元素,直到到达末尾<代码>但是,我得到了EXE\u BAD\u ADESS错误。我想我在递归指针赋值中遗漏了一些东西

template <class T>
struct Node {
    Node *left, *right, *parent;
    int height;
    T value;

    // constructor
    Node(T val)
    : value(val){
        height = 0;
        left = right = NULL;
    }
};


template <class T>
void assignToNext(Node<T> *n, Node<T> *next){

    // base case
    if (n == NULL)
        return;

    // else assign to this node and check for next
    next = n;

    assignToNext(n->left, next);
}
模板
结构节点{
节点*左、*右、*父节点;
内部高度;
T值;
//建造师
节点(T值)
:值(val){
高度=0;
左=右=空;
}
};
模板
void assignToNext(节点*n,节点*next){
//基本情况
如果(n==NULL)
返回;
//else分配给此节点并检查下一步
next=n;
赋值文本(n->左,下一个);
}
然后大体上:

Node<int> a(1);
a.left = new Node<int>(2);
a.left->left = new Node<int>(3);
a.left->left->left = new Node<int>(4);
a.left->left->left->left = new Node<int>(5);

Node<int> *last = NULL;

assignToNext(&a, last);

std::cout << last->value << std::endl;   // I get EXE_BAD_ADDRESS error
节点a(1);
a、 左=新节点(2);
a、 左->左=新节点(3);
a、 左->左->左=新节点(4);
a、 左->左->左->左=新节点(5);
Node*last=NULL;
转让文本(&a,最后一个);
std::cout value
void assignToNext(节点*n,节点*next){

-->

void assignToNext(Node*n,Node*&next){
//注意&

否则,原始指针不会更新并保持为空

assignToNext(&a, last);
此代码无法修改局部变量
Node*last
的值。您刚刚将
NULL
传递给参数
Node*next
。因此
last
的值仍然是
NULL
,并且出现错误。如果要修改指针的值,请使用双指针

void assignToNext(节点*n,节点**next);
赋值文本(&a,&last);

last
正在按值传递…@OliCharlesworth谢谢:)。我确实怀疑。但我仍然觉得很难理解。函数
assignToNext
确实包含一个指针。我以为它会按引用传递。我这里缺少什么吗?但指针本身是按值传递的。函数的操作是n指针的副本。明白了!非常感谢:)
n
next
是函数
assignToNext
中的局部变量。当
assignToNext
返回时,它们将永远消失,因此赋值没有持久的效果。
next
的赋值用于进行递归调用,因此assigNME更改该调用的行为。但是,您可以将调用重写为
assignToNext(n->left,n)
,并删除对
next
的赋值(编译器在优化时可能会执行类似操作)请注意,当您这样做时,参数
next
在您的函数中没有任何用处。事实上,您已经覆盖了传入值。就是这样:)……奇怪的是,我以前从未遇到过这个问题:-o……谢谢!@NikhilJJoshi请在执行之前理解它。您知道@egur添加的
&
是什么吗意思?从你的代码来看,你可能不知道。它不是运算符的地址。@sftrabbit,我确实理解它。只是以前错过了它。@NikhilJJoshi那是什么意思?:)它只是指向指针的指针。与“更改原始对象一次传递指针”相同,再上一层,现在我们通过引用原始指针的地址来更改它。
void assignToNext(Node<T> *n, Node<T> **next);
assignToNext(&a, &last);