gpt4 book ai didi

c++ - 相同的代码在在线 IDE 和本地 IDE 中给出不同的结果

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:37 24 4
gpt4 key购买 nike

下面的程序用于从排序的单链表中删除重复项。该代码在在线 IDE 中给出垃圾值。但是当我评论该行时。

delete curr;

该程序在在线 IDE 中运行良好。这是我写的函数。代码的其他部分由在线法官明确定义(不是我)。

还有没有注释 delete curr; 行的代码在本地 IDE(代码块)中工作正常。

完整程序: http://ideone.com/9bHab0

为什么我得到的是垃圾值?

Node *removeDuplicates(Node *root)
{
// your code goes here
struct Node* curr = root,*prev = NULL;
while(curr)
{
if(prev==NULL)
prev = curr;
else if(curr->data!=prev->data)
prev = curr;
else
{
prev->next = curr->next;
delete curr;
curr = prev->next;
}
}
return root;
}

编辑: 可以看到位置被删除的指针立即被重新分配。因此这里不可能有悬挂指针!

最佳答案

让我们举一个非常简单的例子,有一个双节点列表,你有例如

node1 -> node2

然后是第一次迭代 prevNULL所以你做prev = curr .现在currprev指向同一个节点。

这意味着在第二次迭代中 if条件为假(prev != NULLcurr->data == prev->data)你进入else部分,你有

prev->next = curr->next;
delete curr;
curr = prev->next;

给你delete curr 但是 curr指向与 prev 相同的内存,导致分配中的未定义行为 curr = prev->next ,因为你现在取消引用杂散指针 prev .

更糟的是,您随后进入第三 迭代,其中 prev仍然指向已删除的第一个节点,并再次取消引用无效的 prev指针(在你的第二个 if 条件下)并且你再次以 else 结束继续无效取消引用的部分。以此类推(否则你会崩溃)。

关于c++ - 相同的代码在在线 IDE 和本地 IDE 中给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44844848/

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