• ベストアンサー

セグメンテーション違反が出てしまいます・・・.

#include<stdio.h> typedef struct tag{ int num; char name[10]; struct tag *next; }DATA; void add(void); DATA *head,*wp,*back; int main(void) { FILE *rfp,*wfp; char buf[256]; DATA *p; head=NULL; //ファイルを読み込み--------------------------- rfp=fopen("sample.txt", "r"); while(fgets(buf,256,rfp)!=NULL){ p=(DATA *)malloc(sizeof(DATA)); sscanf(buf,"%d %s", &(p->num),p->name); if(head==NULL){ head=p; head->next=NULL; back=p; } else{ back->next=p; back=p; } p->next=NULL; } fclose(rfp); //読み込み終了--------------------------------- } void add(void){ DATA *newp; newp=(DATA *)malloc(sizeof(DATA)); scanf("%d", &newp->num); scanf("%s", &newp->name); newp->next=NULL; for(wp=head; wp!=NULL; wp=wp->next){ if(head=NULL)head=newp; else if(newp->num < wp->num){ head->next = newp; } } } sample.txtからデータを読み込みそれを構造体のリスト構造にしてその構造体にデータを追加したいのですが、最後のhead->next=newpのところでセグメンテーション違反が出てしまいます。なぜでしょうか? 恐らくプログラムの内容はあまりないと思いますので概要だけ汲み取ってくれたら嬉しいです。因みにadd関数は途中です。

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

if(head=NULL)head=newp; ここで必ずheadがNULLになってしまった直後に、else if以下を実行しています。

wachi888
質問者

お礼

ド素人ですいません・・・。まさにその通りでした。的確な回答ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

うん, #2 の通り add は呼び出されていないね. 全然関係ないけど ・malloc を使うなら stdlib.h を #include してくれ. ・typedef するところで struct tag って, 「tag」という名前は意味をなさないのでやめてほしい. せめて typedef struct DATA { ... } DATA; とか.

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.2

>最後のhead->next=newpのところでセグメンテーション違反 そうでしょうか? せっかく作ったadd関数をどこからも呼び出していません。

すると、全ての回答が全文表示されます。
回答No.1

流れは追ってません。 パッとみてすぐ怖くなったので、回答。 whileの中で、mallocしてますが、なぜ? 確保した領域は、どこで開放(free())するのでしょう? もう少しフローを固めてから、流してみては如何。

wachi888
質問者

お礼

malloc後に解放するのを忘れてました。色々とあやふやなまま作っているのでおっしゃる通りもう少し考えて作りたいと思います。ありがとうございます。

すると、全ての回答が全文表示されます。