相同的代码在联机 IDE 和本地 IDE 中给出不同的结果



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

delete curr;

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

还有没有注释的代码行删除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

使用第一次迭代,prev NULL,因此您可以prev = curr.现在,currprev 指向同一节点。

这意味着在第二次迭代中,两个if条件都是假的(prev != NULLcurr->data == prev->data(,你进入else部分,在那里你有

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

在这里你delete currcurr指向与prev相同的内存,导致赋值curr = prev->next中未定义的行为,因为你现在取消引用杂散指针prev

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

相关内容

  • 没有找到相关文章

最新更新