制作一个非常简单的链表,我发现自己对可能是一个非常简单的作用域概念感到困惑。第一部作品符合预期。似乎在第二个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)