0

誰でもこのセグメンテーション エラーを解決できますか? このコードは単純ですが、エラーを把握するのは非常に困難です。

struct Link {
  int key;
  unsigned data: 2;
  struct Link *next;
  struct Link *previous;
};

struct Link* addInOrder(struct Link *, struct Link);

int main() {
  struct Link *head;
  struct Link data1;
  struct Link data2;
  struct Link data3;
  data1.key = 25;
  data1.data = 1;
  data1.next = NULL;
  data2.key = 50;
  data2.data = 0;
  data2.next = NULL;
  data3.key = 100;  
  data3.data = 2; 
  data3.next = NULL;
  head = NULL;
  head = addInOrder(head, data2);
}

struct Link* addInOrder(struct Link *srt, struct Link l) {
  if(!srt) {
    return &l;
  }

  struct Link *temp = srt;
  while(temp->next && l.key > temp->key)
    temp = temp->next;

  printf("here\n");

  if(l.key > temp->key) {
    printf(" 1\n");
    temp->next = &l;
    l.previous = temp;
  }
  else {
    printf(" 2\n");
    l.previous = temp->previous;
    l.next = temp;
    printf( "2.2\n");
    if(temp->previous) {
      //printf("%i\n",temp->previous->key);
      temp->previous->next = &l;
    }
    printf(" 2.3\n");
    temp->previous = &l;
  }
  return srt;
}

addInOrder() の最初の行でエラーが発生し続けます。コンパイラが言うのはセグメンテーションエラーだけです。

編集: また、printf("...");を追加すると、if ステートメントの直後に実行して実行します...印刷されません

4

2 に答える 2

3

addInOrder()値渡し ( )の 2 番目の引数を渡していますstruct Link l。これにより、関数を呼び出したときに引数のコピーが作成され、 inがスタックaddInOrder()l存在します。次に、ローカル変数のアドレスを返し、それを に割り当てheadますが、関数が終了すると、その変数はスコープ外になり、割り当てが解除されます。したがって、無効なアドレスを に割り当てているためhead、セグメンテーション違反が発生します。

于 2012-12-06T01:53:02.303 に答える
2

その部分(そしてどこでも&l使われている)

if (!srt)
    return &l;

スタック変数のアドレスを返しています。関数addInOrderにはおそらく署名が必要です

struct Link* addInOrder(struct Link* srt, struct Link* l);
于 2012-12-06T01:53:09.713 に答える