0

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

结构和原型:

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 时出现分段错误。

4

3 回答 3

3

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

于 2013-04-27T01:49:29.937 回答
2

因此,根据您的反馈,您的问题是,如果调用代码尝试取消引用,则不是Node *orderedInsert您返回 a 而是返回 a1或 a which 将导致 a 。正如 Lee 指出的那样,还有其他问题,例如您实际上没有正确插入新节点。0seg fault

于 2013-04-27T02:04:23.840 回答
0

您在struct node *“新”指针的声明中错过了分号。您的方法实现由于其返回值而容易发生内存泄漏。

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

这个例程有三个“用例”:

  1. 打电话orderedInsert(NULL,/* whatever */)到地址Node *0x00000001
  2. struct node在堆栈或堆上为类型变量分配空间并调用orderedInsert(/* newly allocated variable pointer */,/* value */),但确保->data新分配的变量等于value您传入的变量。对于这种情况,您的方法返回空指针。时期;
  3. 随时调用orderedInsert(/* Non-null */,/* not equal to "data" */)并享受您的代码循环。
于 2013-04-27T07:43:36.990 回答