制作一个非常简单的链表,我发现自己对可能是一个非常简单的作用域概念感到困惑。第一部作品符合预期。似乎在第二个makeNode函数中,节点“n”在终止时超出范围。我很困惑为什么会这样。

我很确定分配的内存仍然存在,并且这两种方法都有指向该内存的指针。那为什么不工作呢?

该程序具有两个make节点功能

#include <iostream>
using namespace std;

struct Node
{
    int value;
    Node* next;
    Node() : next(NULL){}
};

Node* makeNode1(int value)
{
    Node* n = new Node;
    n->value = value;
    return n;
}

void makeNode2(int value, Node* mountPt)
{
    Node* n = new Node;
    n->value = value;
    mountPt = n;
}

void destroyNode(Node* mountPt)
{
    if(mountPt->next != NULL)
    {
        destroyNode(mountPt->next);
        delete mountPt;
    }
}

int main() {
    Node* origin = NULL;

    // This works
    origin = makeNode1(4);

    // causes a runtime error when dereferenced
    makeNode2(4, origin);

    return 0;
}

最佳答案

对于makeNode2而言,指针参数mountPt本身是按值传递的,因此在函数内部对指针本身的任何修改(例如mountPt = n;)都与原始参数origin无关。

您可以将其更改为通过引用,即

void makeNode2(int value, Node*& mountPt)

10-06 00:03