相同的代码在在线 IDE 和本地 IDE 中给出不同的结果
Same code giving different results in Online IDE and local IDE
下面的程序用于从排序的单链表中删除重复项。该代码在网上给出了垃圾值IDE。但是当我评论这一行时 .
delete curr;
该程序本身在线 IDE 运行良好。这是我写的函数。代码的其他部分由在线法官明确定义(不是我)。
还有没有注释行 delete curr; 的代码在本地 IDE(codeblocks).
中工作正常
为什么我得到垃圾值?
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
。现在 curr
和 prev
指向同一个节点。
这意味着在第二次迭代中,两个 if
条件都为假(prev != NULL
和 curr->data == prev->data
)你进入 else
部分,在那里你有
prev->next = curr->next;
delete curr;
curr = prev->next;
这里你 delete curr
但是 curr
指向与 prev
相同的内存,导致赋值 curr = prev->next
中的 未定义行为 ,因为您现在取消引用杂散指针 prev
.
更糟糕的是,您随后进入 third 迭代,其中 prev
仍指向已删除的第一个节点,并再次取消引用无效的 prev
指针(在你的第二个 if
条件下),你再次结束在 else
部分,在那里你继续无效的取消引用。以此类推(否则会崩溃)。
下面的程序用于从排序的单链表中删除重复项。该代码在网上给出了垃圾值IDE。但是当我评论这一行时 .
delete curr;
该程序本身在线 IDE 运行良好。这是我写的函数。代码的其他部分由在线法官明确定义(不是我)。
还有没有注释行 delete curr; 的代码在本地 IDE(codeblocks).
中工作正常为什么我得到垃圾值?
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
。现在 curr
和 prev
指向同一个节点。
这意味着在第二次迭代中,两个 if
条件都为假(prev != NULL
和 curr->data == prev->data
)你进入 else
部分,在那里你有
prev->next = curr->next;
delete curr;
curr = prev->next;
这里你 delete curr
但是 curr
指向与 prev
相同的内存,导致赋值 curr = prev->next
中的 未定义行为 ,因为您现在取消引用杂散指针 prev
.
更糟糕的是,您随后进入 third 迭代,其中 prev
仍指向已删除的第一个节点,并再次取消引用无效的 prev
指针(在你的第二个 if
条件下),你再次结束在 else
部分,在那里你继续无效的取消引用。以此类推(否则会崩溃)。