【问题标题】:Why do I get a segmentation fault from my while loop?为什么我的 while 循环会出现分段错误?
【发布时间】:2017-02-07 19:32:18
【问题描述】:

我正在使用链表在 C++ 中编写 ADT,并且我不断从我的一个函数中的 while 循环中得到分段错误。我试过自己调试,但找不到问题的根源。

这是函数中的代码:

   void remove(int a){
        cout << "remove" << endl;
        node * temp;
        cout << "remove 2" <<endl;
        while(head->number != a){
            cout << "remove 3" << endl;
            head = head->next;
        }
        cout << "remove 4" << endl;
        temp = head;
        head = head->next;
        delete temp;
    }

head 是一个普通节点,head 中的变量 number 是一个整数。 Head 本身就是一个节点指针。

谢谢!

【问题讨论】:

  • 那么您为什么不告诉我们打印了哪个 cout 语句,以便我们知道从哪里开始查找
  • 命中空指针,我敢打赌。
  • 你永远不会检查你是否命中了一个空指针
  • node * temp 这是怎么回事?
  • while(head->number != a && head!= NULL)

标签: c++ while-loop segmentation-fault


【解决方案1】:

正如大家在cmets中指出的那样,你需要通过检查head的值来检查你是否已经到达列表的末尾。

void remove(int a){
    node * temp;
    node *ptr = head;
    /* Keep iterating list if {Conditional 1 - Head is not NULL && Conditional 2 - number not equal to a} */
    while(ptr && ptr->number != a){
        ptr = ptr->next; //Walk the linked list
    }
    /* Do this only if head is not NULL!! */
    if(ptr != NULL) { 
        /* Save head pointer in temp */
        temp = ptr;
        /* Increment head to point to next node in list */ 
        ptr = ptr->next;
        /* Delete original item pointed to by temp */
        delete temp;
    }
}

理想情况下,'head' 总是指向列表的开头(因此名称为 head)。我们通常在迭代列表之前声明一个指向head的临时指针。

【讨论】:

    【解决方案2】:

    在使用数字之前,您必须检查 head 是否指向 null

    【讨论】:

    • 你应该使用他的例子,因为他的代码最少,你可以简单地说 while(head->number != a && head!=NULL)
    • @OmidCompSCI 正确的做法其实是while(head != nullptr &amp;&amp; head-&gt;number != a)
    • 为什么不能接受 NULL,抱歉之前没用过 nullptr,在学校他们只教 NULL
    • 问题是语句的顺序
    • 在 C++11 中,他们引入了 nullptr 用于引用空指针的类型安全方式。 NULL 仍然是允许的,并且是 C 中的首选选项,但它的处理方式通常与您预期的不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2011-04-23
    相关资源
    最近更新 更多