OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

ご教授ください。Segmentation faultが突然出ました!

  • すぐに回答を!
  • 質問No.200306
  • 閲覧数171
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

卒論でプログラム作成しているのですが、Segmentation faultがでて困っています。
おそらく以下の個所があやしいと思うのですが、どこが危険か教えていただけるでしょうか?大きいプログラムなため以下にあやしい個所を一部抜粋します。

関数Bが特にあやしいと思っていますが、どう直していいのかわかりません;;

/* main一部 */
struct buf{
int id;
int no;
int wnd;
struct buf *next;
};

struct buf temp;
struct buf *restart1=&temp;
struct buf *resenddata1;
struct buf *rere;

/* 関数Aの一部 */
flowdata = (struct buf *)malloc(sizeof(struct buf));

resenddata1->next=flowdata;
flowdata->next=NULL;
resenddata1=flowdata;
temp_num[n]++;
resenddata1->no=temp_num[n];
resenddata1->wnd=cwnd[n];

/* 関数Bの一部 */
if(restart1->next != NULL){
rere = restart1->next;
restart1->next = rere->next;
if(check_no[n] == rere->wnd){
t_dep[n]=t+ceil(rto[n])*2-d12*2;
if(rere->no > max_no[n]){
max_no[n] = rere->no;
}
}
free(rere);
}

簡単に説明しますと、restartというスタート地点にどんどんresenddataをつなげていっています。(最後にNULL)ある地点にいくとrestart->nextをrereに入れてrereを解放という形です。ちなみにrestart1,restart2と同じようなものがあり、関数Aとrereは同じものを使うようにしています。(resenddata2として.rereは共通)
お手数ですが、よろしくお願いします。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル12

ベストアンサー率 48% (325/664)

>確かに(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さん丁寧なご回答ありがとうございました。
投稿日時 - 2002-01-17 23:55:53
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル12

ベストアンサー率 48% (325/664)

/* 関数Aの一部 */ flowdata = (struct buf *)malloc(sizeof(struct buf)); resenddata1->next=flowdata;  // (1) flowdata->next=NULL; resenddata1=flowdata; // (2) temp_num[n]++; resenddata1->no= ...続きを読む
/* 関数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;
を行っています。

未熟なためいろいろおかしいかと思いますが引き続き募集させていただきます。
投稿日時 - 2002-01-17 20:43:46
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ