gpt4 book ai didi

c++ - 结构对象的指针成员在传递给函数时被修改

转载 作者:行者123 更新时间:2023-11-30 01:03:51 26 4
gpt4 key购买 nike

我不太熟悉 C++/指针,但正在尝试实现单向链表。

我只是创建一个Node(head)并在head 之后添加Node 每次一个新的一个被添加到列表中。

struct Node {
int key;
Node *next;

Node() : key(-1), next(nullptr) { }
Node(int k) : key(k), next(nullptr) { }
};

void AddNode(Node *head, int key) { // Create a new node & add it after the head
Node newNode(key);
newNode.next = head->next;
head->next = &newNode;
}

void PrintNode(Node *nptr, string pre, string post) {
cout << pre << "(" << nptr << "), " << nptr->key << ", " << nptr->next << post;
}

void PrintLL(Node *nptr) {
if (nptr) {
PrintNode(nptr, "\n", "");
nptr = nptr->next;
while (nptr) {
PrintNode(nptr, " -> ", "");
nptr = nptr->next;
}
}
cout << endl;
}

int main()
{
Node n1(1); // Node(1) or head
Node *head = &n1;

AddNode(head, 2); // Node(2)
PrintLL(head); // Node(2) gets modified with this call in VS 17

AddNode(head, 3); // Node(3) turns out to be Node(2) with 3 as key in MinGW
PrintLL(head);

return 0;
}

当我在 VS 2017 中运行这个程序时,会抛出异常。调试显示 Node(2)head(Node(1)) 之后正确添加,但是当 PrintLL() 被称为 Node(2)key 被更改为一些随机数 & nextNULL0xcccccccc

当此程序使用 MinGW 编译并运行时,它运行但分配 Node(2) & Node(3) 与此输出建议的内存相同(?) -

(0x71fe30), 1, 0x71fdf0 -> (0x71fdf0), 2, 0

(0x71fe30), 1, 0x71fdf0 -> (0x71fdf0), 3, 0

我不确定我错过了什么,也无法弄清楚。请帮忙。

谢谢。

最佳答案

您在 AddNode() 中有一个悬空引用。 Node newNode(key); 是一个局部变量,在 AddNode() 返回后不复存在。因此,head->next 指向任何地方。要么使用 new 在堆上手动分配,要么更好地使用像 std::unique_ptr 这样的智能指针。

NodeAddNode 可能如下所示:

struct Node {
int key;
std::unique_ptr<Node> next;

Node(int k = -1, std::unique_ptr<Node> n = {})
: key(k), next(std::move(n))
{ }
};

Node& AddNode(Node& head, int key)
{
head.next = std::make_unique<Node>(key, std::move(head.next));
return *head.next;
}

编辑。请注意下面关于此方法潜在缺陷的第一条评论 - 自动列表释放期间的堆栈溢出。

关于c++ - 结构对象的指针成员在传递给函数时被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51880859/

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