Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
链表,C++分割故障_C++_List_Pointers_Linked List - Fatal编程技术网

链表,C++分割故障

链表,C++分割故障,c++,list,pointers,linked-list,C++,List,Pointers,Linked List,我一直无法完成我的家庭作业,因为我似乎无法确定这个分段错误的来源 我正在尝试将节点从文件添加到链接列表中。我已经运行了多个测试,并且已经将问题缩小了很多,但是,我不知道到底是什么造成了问题,因此当我尝试更改其他细节时,我会产生新的问题 这是我的第二门课,所以,希望我的代码不是那么糟糕,它没有帮助。 下面是add方法: bool OrderedList::add (CustomerNode* newEntry) { if (newEntry != 0) { CustomerNode

我一直无法完成我的家庭作业,因为我似乎无法确定这个分段错误的来源

我正在尝试将节点从文件添加到链接列表中。我已经运行了多个测试,并且已经将问题缩小了很多,但是,我不知道到底是什么造成了问题,因此当我尝试更改其他细节时,我会产生新的问题

这是我的第二门课,所以,希望我的代码不是那么糟糕,它没有帮助。 下面是add方法:

    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岁是弗雷德,等等。。。。