我知道这个问题之前已被问过很多次,但我似乎无法弄清楚我得到的错误。这是我的代码:
int remove(ListNode * &head, int length)
{
if(head != NULL)
{
string str = head->word;
if(str.size() > length)
{
if(head->next->next != NULL)
{
head->word = head->next->word;
ListNode* tempNode = head->next->next;
delete head->next; //segfault
head->next = tempNode;
return 1 + remove(head->next, length);
}
else if(head->next != NULL)
{
head->word = head->next->word;
delete head->next;
head->next = NULL;
return 1 + remove(head->next, length);
}
else
{
delete head;
head = NULL;
return 1 + remove(head->next, length);
}
}
else
{
return remove(head->next, length);
}
}
return count;
}
目标是删除任何大小大于参数中指定长度的单词。当我尝试删除head->接下来时会发生错误,即使它显然存在并且我也可以打印出该单词。我得到的错误是
*“./a.out”出错:双重免费或损坏(输出):0x00007ffde3d4d7c0 * 已中止(核心转储)
我尝试在其上运行Valgrind,但无法解释输出,因为它没有指定任何行号。 感谢您对这个简单问题的任何帮助。
答案 0 :(得分:1)
注意:这个答案的第一部分是在OP编辑代码之前(见下面的新答案)
这部分:
" ".join()
很糟糕。
首先,你不应该设置:
head == NULL;
return remove(head->next, length, count + 1);
^^^^
应该是:
head == NULL;
^^
此外,您不应该在之后再次调用该函数:
HEAD = NULL;
完成后(您刚刚删除了return remove(head->next, length, count + 1);
元素,因此head
为NULL)。只需head
(或您想要返回的任何值)。
回答编辑过的问题
新代码存在问题:
return 0;
一般来说,我不认为使用递归函数调用对这个问题有好处。非递归方法是:
if(head->next->next != NULL) // Here you know that head isn't NULL
{ // but head->next can still be NULL so
.... // don't do head->next->next !
}
else if(head->next != NULL) // This check should also be part
{ // of your first if-statement. Like:
.... // if ((head->next != NULL) && (head->next->next != NULL))
}
else
{
....
}