アプリ版:「スタンプのみでお礼する」機能のリリースについて

卒論でプログラム作成しているのですが、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は共通)
お手数ですが、よろしくお願いします。

A 回答 (2件)

>確かに(1)は必要ないですね^^;


いや、必要でした。
resenddata1には今まででに確保したbufのアドレスが入るわけですね。
しかも、No.1のお礼に記述の初期化処理があると。
その場合は確かにこの処理になります。

では更に質問です。
/* 関数Bの一部 */ では、データ列の中間部の開放処理しか書かれていないのですが、先頭部、および、最後尾の処理はどうなっているのでしょうか。

あと、
>struct buf temp;
>struct buf *restart1=&temp;
の部分ですが、この部分の処理に?となってしまいました。

このデータ構造の場合、tempを使わず、main()の始めのほうでmalloc()した領域をrestart1に設定するのが相場なので。
    • good
    • 0
この回答へのお礼

再度ご回答ありがとうございます。

私自身未熟なので四苦八苦しながら作っているので、プログラムに自信がまったくないので、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

/* 関数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へのコピーは行われているのでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

確かに(1)は必要ないですね^^;

補足として初期設定でmain内で
resenddata=restart;
restart->nest=NULL;
を行っています。

未熟なためいろいろおかしいかと思いますが引き続き募集させていただきます。

お礼日時:2002/01/17 20:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!