gpt4 book ai didi

c++ - 指针和引用问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:39 27 4
gpt4 key购买 nike

我正在创建类似于结构列表的东西。在 main 的开头,我声明了一个空指针。然后我调用 insert() 函数几次,传递对该指针的引用,以添加新元素。

但是,似乎有些不对劲。我无法显示列表的元素,std::cout 只是破坏了程序,即使它在没有警告的情况下编译。

#include <iostream>

struct node {
node *p, *left, *right;
int key;
};

void insert(node *&root, const int key)
{
node newElement = {};
newElement.key = key;

node *y = NULL;
std::cout << root->key; // this line
while(root)
{
if(key == root->key) exit(EXIT_FAILURE);
y = root;
root = (key < root->key) ? root->left : root->right;
}

newElement.p = y;

if(!y) root = &newElement;
else if(key < y->key) y->left = &newElement;
else y->right = &newElement;
}

int main()
{
node *root = NULL;
insert(root, 5);
std::cout << root->key; // works perfectly if I delete cout in insert()
insert(root, 2);
std::cout << root->key; // program breaks before this line
return 0;
}

如您所见,我在插入函数中创建了新的结构元素并将其保存在根指针中。在第一次调用中,甚至没有启动 while 循环,因此它可以工作,并且我能够在 main 函数中显示 root 的元素。

但在第二次调用中,while 循环已经工作,我得到了我描述的问题。

root->key 语法有问题,因为即使我把它放在第一次调用中它也不起作用。

出了什么问题,原因是什么?

另外,我经常看到通过这样的指针插入新列表的元素:

node newElement = new node();
newElement->key = 5;
root->next = newElement;

这段代码是否等于:

node newElement = {};
newElement.key = 5;
root->next = &newElement;

?会干净一些,也不需要删除内存。

最佳答案

问题是因为您将一个指向局部变量的指针从函数中传递出来。取消引用此类指针是未定义的行为。你应该用 new 分配 newElement

这段代码

node newElement = {};

创建一个局部变量newElement。一旦函数结束,newElement 的作用域就结束了,它的内存被销毁了。但是,您将指向该被破坏内存的指针传递到函数外部。函数退出后,对该内存的所有引用都将失效。

另一方面,这段代码

node *newElement = new node(); // Don't forget the asterisk

在空闲存储区分配一个对象。在您明确delete 之前,此类对象一直可用。这就是为什么您可以在创建它们的函数退出后使用它们的原因。当然由于 newElement 是一个指针,你需要使用 -> 来访问它的成员。

关于c++ - 指针和引用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16119317/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com