链表,C++分割故障
我一直无法完成我的家庭作业,因为我似乎无法确定这个分段错误的来源 我正在尝试将节点从文件添加到链接列表中。我已经运行了多个测试,并且已经将问题缩小了很多,但是,我不知道到底是什么造成了问题,因此当我尝试更改其他细节时,我会产生新的问题 这是我的第二门课,所以,希望我的代码不是那么糟糕,它没有帮助。 下面是add方法:链表,C++分割故障,c++,list,pointers,linked-list,C++,List,Pointers,Linked List,我一直无法完成我的家庭作业,因为我似乎无法确定这个分段错误的来源 我正在尝试将节点从文件添加到链接列表中。我已经运行了多个测试,并且已经将问题缩小了很多,但是,我不知道到底是什么造成了问题,因此当我尝试更改其他细节时,我会产生新的问题 这是我的第二门课,所以,希望我的代码不是那么糟糕,它没有帮助。 下面是add方法: bool OrderedList::add (CustomerNode* newEntry) { if (newEntry != 0) { CustomerNode
bool OrderedList::add (CustomerNode* newEntry)
{
if (newEntry != 0)
{
CustomerNode * current;
CustomerNode * previous = NULL;
if(!head)
head = newEntry;
current = head;
// initialize "current" & "previous" pointers for list traversal
while(current && *newEntry < *current) // location not yet found (use short-circuit evaluation)
{
// move on to next location to check
previous = current;
current = current->getNext();
}
// insert node at found location (2 cases: at head or not at head)
//if previous did not acquire a value, then the newEntry was
//superior to the first in the list.
if(previous = NULL)
head = newEntry;
else
{
previous->setNext(newEntry); //Previous now needs to point to the newEntry
newEntry->setNext(current); //and the newEntry points to the value stored in current.
}
}
return newEntry != 0; // success or failure
}
这是为了纠正一个不同的segfault而做的大量工作的结果,而这一个更令人惊讶。我不知道我的setNext方法是如何导致问题的,这里是:
void CustomerNode::setNext (CustomerNode* newNext)
{
//set next to newNext being passed
next = newNext;
return;
}
提前感谢,如果有必要识别这个问题,我将很高兴发布更多的代码 是的
if(previous = NULL)
而不是
if(previous == NULL)
这会将previous设置为NULL,然后进入else分支:
导致未定义的行为。这是
if(previous = NULL)
if(previous = NULL)
而不是
if(previous == NULL)
这会将previous设置为NULL,然后进入else分支:
导致未定义的行为
if(previous = NULL)
似乎有点可疑,因为它的评估结果总是错误的
您可以通过两种主要方式避免此类错误:
慷慨地使用const,把它洒在几乎所有你能洒的地方,然后
与某个值进行比较时,将该值放在左侧
例如,写
if( NULL = previous )
并获得编译错误,而不是崩溃或错误结果
我个人不做左边的值,因为我从来没有这个问题。我怀疑部分是因为我对康斯特相当慷慨。但作为初学者,我认为这是个好主意
似乎有点可疑,因为它的评估结果总是错误的
您可以通过两种主要方式避免此类错误:
慷慨地使用const,把它洒在几乎所有你能洒的地方,然后
与某个值进行比较时,将该值放在左侧
例如,写
if( NULL = previous )
并获得编译错误,而不是崩溃或错误结果
我个人不做左边的值,因为我从来没有这个问题。我怀疑部分是因为我对康斯特相当慷慨。但是作为一个初学者,我认为这是一个好主意。您可以发布所有代码,但我看到的第一个明显问题是:
if(previous = NULL)
在C/C++/Java中使用=是一个非常非常常见的错误,而您的意思是==。您可以发布所有代码,但我看到的第一个明显问题是:
if(previous = NULL)
在C/C++/Java中使用=是一个非常非常常见的错误,而你的意思是==。Y你没有std::list和std::string吗?我认为应该有人编辑它,用just work代替家庭作业,因为家庭作业是如此不受欢迎。不要说已经过时了。你没有std::list和std::string吗?我认为应该有人编辑这个,用简单的工作来代替家庭作业,因为家庭作业是如此的不受欢迎。更不用说衰老了,没那么普遍。另外,在Java中,您会得到一个编译错误,因为您不能将引用视为布尔值。在C/C++中,这是一个非常常见的错误,而且不太容易发现,特别是当您刚刚开始使用该语言时。不是那么常见。另外,在Java中,您会得到一个编译错误,因为您不能将引用视为布尔值。在C/C++中,这是一个非常常见的错误,不容易发现,特别是当您刚刚开始使用该语言时。谢谢!我重写了很多次这个方法。。。我真的希望我在这个迭代中有一个可管理的问题。养成把常数放在第一位的习惯。这样,如果你不小心掉了第二个等号,编译器会对你咆哮。错误C0042:ifNULL=previous未将其剪切。而且,NULL是老派的。今天,我们年轻人使用nullptr@user1713830如果你在和user17说话。。。你应该在评论中给他贴上标签,这样他才能真正读到。至于YODA条件,主要取决于编码指南和现有代码。如果99%的现有代码将常量作为第二个参数写入operator==,那么更改它并采用自己的样式弊大于利。另外,C++11还没有普及到使用nullptr而不是NULL。谢谢!我重写了很多次这个方法。。。我真的希望我在这个迭代中有一个可管理的问题。养成把常数放在第一位的习惯。这样,如果你不小心掉了第二个等号,编译器会对你咆哮。错误C0042:ifNULL=previous未将其剪切。而且,NULL是老派的。今天,我们年轻人使用nullptr@user1713830如果你在和user17说话。。。你应该在评论中给他贴上标签,这样他才能真正读到。至于YODA条件,主要取决于编码指南和现有代码。如果99%的现有代码将常量作为第二个参数写入operator==,那么更改它并采用自己的样式弊大于利。另外,C++11还没有普及到使用nullptr而不是NULL的程度
疗法;可能是因为在生活中后来进入C++并在Pascal和艾达等敏感语言中长大,其中比较= =和赋值是:=:它可以是避免这种容易出错的有用技术,但是它与帮助你理解自然语言的方式相比,不利于可读性。英语例如,你永远不会说30是弗雷德,等等……我也不会那样做;可能是因为在生活中后来进入C++并在Pascal和艾达等敏感语言中长大,其中比较= =和赋值是:=:它可以是避免这种容易出错的有用技术,但是它与帮助你理解自然语言的方式相比,不利于可读性。英语你永远不会说30岁是弗雷德,等等。。。。