C语言 查找分段故障



我只是需要另一双眼睛来帮我指出一个我肯定犯过的愚蠢错误。

Struct and prototype:

typedef struct node {
    int data;
    struct node *next;
} Node;
Node *orderedInsert(Node *p, int newval);
/* Allocates a new Node with data value newval
   and inserts into the ordered list with 
   first node pointer p in such a way that the
   data values in the modified list are in 
   nondecreasing order as the list is traversed.
*/

功能:

#include "orderedList.h"
#include <stdio.h>
#include <stdlib.h>
Node *orderedInsert(Node *p, int newval){
       struct node* new = NULL
       new = malloc(sizeof(struct node));
       struct node* last = p;
       while(1){
          if (p == NULL){
             if (last == p){
                return 1;
             }
             new->data = newval;
             new->next = NULL;
             break;
          }
          if ((last->data <= newval) && (p->data >= newval)){
             new->data = newval;
             new->next = p;
             break;
          }
       }
       return 0;
    }

当调用orderedInsert与任何参数时,我得到一个分段错误。

我不认为函数本身是分段的,它可能在调用代码中,你没有向我们展示。尽管这里有几个明显的错误。最明显的是,它实际上没有插入任何东西。该函数创建新节点,但它从不以任何方式更改现有列表,因此该节点是孤立的。第二,它被声明为返回一个指针,但它返回0或1。这不会出现段错误,但如果调用者期望得到一个指针并以这种方式解引用它,你就会。

因此,根据您的反馈,您的问题是,不是从orderedInsert返回Node *,而是返回10,如果调用代码试图解引用将导致seg fault。正如Lee指出的,还存在其他问题,例如实际上没有正确插入新节点。

您在struct node * "new"指针声明中遗漏了分号。你的方法实现容易由于它的返回值而导致内存泄漏。

实际上,当谈到这种方法时,很明显它永远不会产生分割错误。大多数情况下,此方法将循环,直到您关闭运行它的进程。

这个例程有三个"用例":

  1. 呼叫orderedInsert(NULL,/* whatever */),在0x00000001地址获取Node *;
  2. 在堆栈或堆上为struct node类型变量分配空间并调用orderedInsert(/* newly allocated variable pointer */,/* value */),但确保新分配的变量的->data等于您传入的value。对于这个实例,您的方法返回空指针。期;
  3. 调用orderedInsert(/* Non-null */,/* not equal to "data" */),享受你的代码循环所有的时间。

相关内容

  • 没有找到相关文章

最新更新