• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ご教授ください。Segmentation faultが突然出ました!)

プログラム作成でSegmentation faultが発生!個所を特定して修正方法を教えてください

このQ&Aのポイント
  • 卒論で作成中のプログラムでSegmentation faultが発生しており困っています。
  • 主な問題箇所は関数Bで、どのように修正すれば良いかわかりません。
  • プログラムはrestartというスタート地点にresenddataをつなげていく形で動作していますが、特定の地点でSegmentation faultが発生しています。

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

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

>確かに(1)は必要ないですね^^; いや、必要でした。 resenddata1には今まででに確保したbufのアドレスが入るわけですね。 しかも、No.1のお礼に記述の初期化処理があると。 その場合は確かにこの処理になります。 では更に質問です。 /* 関数Bの一部 */ では、データ列の中間部の開放処理しか書かれていないのですが、先頭部、および、最後尾の処理はどうなっているのでしょうか。 あと、 >struct buf temp; >struct buf *restart1=&temp; の部分ですが、この部分の処理に?となってしまいました。 このデータ構造の場合、tempを使わず、main()の始めのほうでmalloc()した領域をrestart1に設定するのが相場なので。

noname#1283
質問者

お礼

再度ご回答ありがとうございます。 私自身未熟なので四苦八苦しながら作っているので、プログラムに自信がまったくないので、hitomuraさんの回答に「ああ、必要なかったか・・」とすぐに思い込んでしまいました^^; まず、ちょっと最初に説明足らずなところがあったことをお詫びします。かなり大きいプログラムなので全体をのせるわけにもいかず、抜粋したのですが大事なところが抜けていました^^;;以下の部分もそうです。 関数Bのリストの先頭と最後尾ですが関数Aの部分のリストそのものです。つまり すべての関数が参照するexterns.hというヘッダ内で extern struct buf temp; extern struct buf *restart; extern struct buf *resenddata; という処理がしてあり、main.c内で struct buf temp; struct buf *restart=&temp; struct buf *resenddata; としています。つまり先頭はrestartで最後はNULLとなっています。 追加のご質問ですが、そこの部分の処理で最初の構造体の場所を記憶しているのですが、確かにご指摘の方法の方がスマートかと思います。そちらに変更してみようと思っています。 問題のあったプログラムですが、リストの数を表示するようにして問題個所をつめていったところ直りました。 最後になりましたが、hitomuraさん丁寧なご回答ありがとうございました。

その他の回答 (1)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

/* 関数Aの一部 */ flowdata = (struct buf *)malloc(sizeof(struct buf)); resenddata1->next=flowdata;  // (1) flowdata->next=NULL; resenddata1=flowdata; // (2) temp_num[n]++; resenddata1->no=temp_num[n]; resenddata1->wnd=cwnd[n]; (1)で設定したデータは(2)で消えてしまいますが、その前にrestartへのコピーは行われているのでしょうか?

noname#1283
質問者

お礼

回答ありがとうございます。 確かに(1)は必要ないですね^^; 補足として初期設定でmain内で resenddata=restart; restart->nest=NULL; を行っています。 未熟なためいろいろおかしいかと思いますが引き続き募集させていただきます。