【问题标题】:Why is this function showing segmentation fault?为什么这个函数显示分段错误?
【发布时间】:2018-02-06 01:07:21
【问题描述】:

这是一个插入排序链表的函数,但它显示分段错误(SIGSEGV)

void sortedInsert(struct node **head_ref, int data) {
    struct node *new_node, *prev, *current;
    new_node = (struct node*)malloc(sizeof(struct node));
    new_node->data = data;
    new_node->next = NULL;
    if (*head_ref == NULL || (*head_ref)->data > data) {
        new_node->next = *head_ref;
        *head_ref = new_node;
        return;
    }
    current = *head_ref;
    prev = NULL;
    while (current->data < data && current != NULL) {
        prev = current;
        current = current->next;
    }
    prev->next = new_node;
    new_node->next = current;
}

【问题讨论】:

  • 很可能是因为它有一个或多个错误,您可以使用调试器找到这些错误。
  • 不要在 C++ 中 malloc。
  • while(current-&gt;data&lt;data&amp;&amp;current!=NULL) 应该是while(current!=NULL &amp;&amp; current-&gt;data &lt; data)
  • 这是一个运行时问题,但发布的代码无法编译。请发帖minimal reproducible example
  • struct node的定义是什么?

标签: c linked-list segmentation-fault


【解决方案1】:

这里的分段错误很可能是由于以下语句:

while(current->data<data&&current!=NULL)
    {
        prev=current;
        current=current->next;
    }

此处的当前指针正在解释,而不检查为null。您应该尝试将条件更改为while(current &amp;&amp; current-&gt;data&lt;data),以便在取消引用之前检查指针是否为 NULL。

【讨论】:

    【解决方案2】:

    如果此语句在第一次迭代中失败:

    while(current->data<data&&current!=NULL)
    

    那么这个语句:

    prev->next=new_node;
    

    将访问从地址 0 开始的偏移量,这几乎总是会导致段错误事件。

    【讨论】:

      【解决方案3】:

      错误在这里:while (current-&gt;data &lt; data &amp;&amp; current != NULL)。指针必须与NULL被取消引用之前进行检查:

      while (current != NULL && current->data < data)
      

      注意,这个函数可以用一个循环来简化:

      void sortedInsert(struct node **head_ref, int data) {
          struct node *new_node;
          while (*head_ref && (*head_ref)->data <= data) {
              head_ref = &(*head_ref)->next;
          }
          new_node = malloc(sizeof(struct node));
          if (new_node == NULL) {
              /* handle the error */
              ...
          } else {
              new_node->data = data;
              new_node->next = *head_ref;
              *head_ref = new_node;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-11-25
        • 2019-01-07
        • 2022-01-05
        • 2011-09-13
        • 1970-01-01
        • 2020-10-16
        • 2011-05-18
        • 1970-01-01
        • 2020-08-01
        相关资源
        最近更新 更多