首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在不显式分配内存空间的情况下向链表添加节点(不使用new)

在不显式分配内存空间的情况下向链表添加节点(不使用new)
EN

Stack Overflow用户
提问于 2019-05-13 00:26:43
回答 1查看 79关注 0票数 -1

所以我正在学习如何创建一个链表,我想知道为什么我们在添加节点时需要使用"new“。下面是正确添加节点的函数:

代码语言:javascript
复制
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++的新手,当我试图自己弄清楚如何做到这一点时,而不是有一句台词:

代码语言:javascript
复制
Node* new_node_ptr = new Node;

我写道:

代码语言:javascript
复制
Node new_node;
Node* new_node_ptr = &new_node;

这不管用。似乎每次尝试添加新节点时,new_node变量都会被分配给相同的内存地址。这既令人着迷,又令人气愤。有人能向我解释一下c++的怪异之处吗?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2019-05-13 00:32:16

当你写的时候

代码语言:javascript
复制
Node new_node;

该变量是在堆栈上创建的,一旦addNode退出,就不应使用该变量。一旦函数退出,addNode就会失去对该内存的“所有权”,并且与new_node相关的内存将被程序的其他部分再次使用。尝试使用它是未定义的行为,不能依赖。

您必须动态分配内存,以确保数据的生命周期超出函数的作用域。

在使用堆栈分配的第二种情况下,如果总是为new_node分配相同地址的内存,那么在您的测试用例中就会发生这种情况。这取决于在addNode之前调用其他函数的顺序,这可能不会总是发生,在“真正的程序”中也可能不会一致。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56101205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档