0

私が確かに犯したばかげた間違いを指摘するのを助けるために、もう1組の目が必要です。

構造とプロトタイプ:

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 *fromを返す代わりに aまたは a のorderedInsertいずれかを返していることです。呼び出し元のコードが逆参照しようとすると、. Lee が指摘したように、実際には新しいノードを適切に挿入していないという事実など、他の問題があります。10seg fault

于 2013-04-27T02:04:23.840 に答える
0

struct node *「新しい」ポインタの宣言でセミコロンが抜けています。メソッドの実装では、戻り値が原因でメモリ リークが発生しやすくなっています。

実際、その方法について話すと、セグメンテーション違反が発生しないことは明らかです。ほとんどの場合、このメソッドは実行中のプロセスをシャットダウンするまでループします。

このルーチンには 3 つの「使用例」があります。

  1. 電話して住所orderedInsert(NULL,/* whatever */)を取得Node *します。0x00000001
  2. struct nodeスタックまたはヒープのいずれかで型変数にスペースを割り当てて呼び出しますが、新しく割り当てた変数が渡したものと等しいことorderedInsert(/* newly allocated variable pointer */,/* value */)を確認してください。このインスタンスの場合、メソッドは null ポインターを返します。限目;->datavalue
  3. コードを呼び出しorderedInsert(/* Non-null */,/* not equal to "data" */)て、常にループを楽しんでください。
于 2013-04-27T07:43:36.990 に答える