所以我正在学习如何创建一个链表,我想知道为什么我们在添加节点时需要使用"new“。下面是正确添加节点的函数:
void addNode(int value){
Node* new_node_ptr = new Node;
new_node_ptr->value = value;
if (root == NULL){
root = new_node_ptr;
traveler = new_node_ptr;
} else {
traveler->next = new_node_ptr;
traveler = new_node_ptr;
}
}
但是,由于我是c++的新手,当我试图自己弄清楚如何做到这一点时,而不是有一句台词:
Node* new_node_ptr = new Node;
我写道:
Node new_node;
Node* new_node_ptr = &new_node;
这不管用。似乎每次尝试添加新节点时,new_node变量都会被分配给相同的内存地址。这既令人着迷,又令人气愤。有人能向我解释一下c++的怪异之处吗?
谢谢!
发布于 2019-05-13 00:32:16
当你写的时候
Node new_node;
该变量是在堆栈上创建的,一旦addNode
退出,就不应使用该变量。一旦函数退出,addNode
就会失去对该内存的“所有权”,并且与new_node
相关的内存将被程序的其他部分再次使用。尝试使用它是未定义的行为,不能依赖。
您必须动态分配内存,以确保数据的生命周期超出函数的作用域。
在使用堆栈分配的第二种情况下,如果总是为new_node
分配相同地址的内存,那么在您的测试用例中就会发生这种情况。这取决于在addNode
之前调用其他函数的顺序,这可能不会总是发生,在“真正的程序”中也可能不会一致。
https://stackoverflow.com/questions/56101205
复制相似问题