意外的指针行为

时间:2013-12-26 16:10:57

标签: c++

我对以下演示代码中出现的问题感到困惑。我预计下一个将继续指向链中的下一个元素,直到达到结束。 However, I get EXE_BAD_ADDESS错误。我想我在递归指针赋值中遗漏了一些东西。

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

然后是主要的:

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

提前致谢, NIKHIL

2 个答案:

答案 0 :(得分:3)

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

- &GT;

void assignToNext(Node<T> *n, Node<T> *&next){ //请注意&amp;

否则原始指针不会更新并保持为NULL。

答案 1 :(得分:2)

assignToNext(&a, last);

此代码无法修改局部变量Node<int> *last的值。您刚刚将NULL传递给参数Node<T> *next。因此last的值仍为NULL而且您收到了错误消息。如果要修改指针的值,请使用双指针。

像,

void assignToNext(Node<T> *n, Node<T> **next);
assignToNext(&a, &last);