

以下のコードは双方向リストを用いて入力した数値を昇順に格納するプログラムです。

`void insert（）` は p の指す要素の前に w の指す要素を挿入する。  
`struct data_t *insert_pos(struct data_t *p, struct data_t :*w)`:先頭要素 p を受け取り、  
w の挿入する位置を返す。  
`void printasc(struct data_t*p), void printdsc(struct data_t *p)`: 先頭要素 p を受けと

[code]

    #include <stdio.h>
    #include <stdlib.h>
    
    struct data_t{
      int num;
      struct data_t *next, *prev;
    };
    
    void insert(struct data_t *p, struct data_t *w){
        p->prev->next=w;
        w->prev=p->prev;
        p->prev=w;
        w->next=p;
    }
    
    void remove_list(struct data_t *p,int index){
      struct data_t *a;
      int i=0;
      for(a=p->next;a!=p;a=a->next){
        if(i== index){
          a->next->prev=a->prev;
          a->prev->next=a->next;
          break;
        }
        i+=1;
      }
    }
    
    
    void printall(struct data_t *p){
      struct data_t *a;
      for(a=p->next;a!=p;a=a->next){
      printf("[p:%p, bp:%p, fp:%p, data:%d]\n", a, a->prev, a->next, a->num);
      }
      printf("\n");
    }
    
    
    int main(){
      struct data_t *p, *w, *head;
      int d, count=0;
      head->next=head;
      head->prev=head;
      printf("State Input\n");
      for(;scanf("%d", &d)!=EOF;count++){
        w=(struct data_t *)malloc(sizeof(struct data_t));
        w->num=d;
        insert(head, w);
      }
      printf("State Remove\n");
      while(scanf("%d", &d)!=EOF){
        if(count<=d){
          printf("List does not have the index number:%d\n", d);
        }else if(count>d){
          remove_list(head, d);
          count-=1;
        }
      }
      printall(head);
      return 0;
    }
    
[/code]


CC BY-SA 4.0
2019-11-05T11:02:53.147
60276
2019-11-05T17:06:44.063
2019-11-05T11:12:58.093
3475
36484
question
c
Segmentation fault の原因


コンパイル時にエラーが発生していないなら、エラー検出とか警告レベルのオプションを見直した方が良いですよ。  
あるいは作業環境を変えるとか。

Visual Studio Community 2019のC/C++では、まず`head->next = head;`の行で「初期化されていないメモリ
'head' を使用しています。」の警告とか「初期化されていないローカル変数 'head' が使用されます」のエラーとなっています。

つまり`head`の領域を確保していないのに、そのアドレスを使ったために発生しているのでしょう。

* * *

アルゴリズムを学ぶ・試すのも大事ですが、基本的なことをおろそかにしていては、簡単なところでつまずいて無駄な時間が掛かるばかりです。

全部が正解かは怪しいですし、時間が経過して変化してしまうことも多いのですが、  
以下のような記事を探して書かれていることを読んで心がけるようにしましょう。

[C言語のバグ回避をするための習慣](https://qiita.com/Ki4mTaria/items/b6ab0bcbe9c87d4dc071)  
[C言語のバグ回避をするための習慣：私の場合](https://eel3.hatenablog.com/entry/20150201/1422764793)  
[第4回 C言語のテクニカルバグ](https://www.soum.co.jp/misc/programmer/4/)  
[私はC言語を知らない](https://postd.cc/i-do-not-know-c/)


CC BY-SA 4.0
2019-11-05T12:47:44.873
60279
2019-11-05T17:06:44.063
2019-11-05T17:06:44.063
26370
26370
60276
answer