
卒論でプログラム作成しているのですが、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は共通)
お手数ですが、よろしくお願いします。
No.2ベストアンサー
- 回答日時:
>確かに(1)は必要ないですね^^;
いや、必要でした。
resenddata1には今まででに確保したbufのアドレスが入るわけですね。
しかも、No.1のお礼に記述の初期化処理があると。
その場合は確かにこの処理になります。
では更に質問です。
/* 関数Bの一部 */ では、データ列の中間部の開放処理しか書かれていないのですが、先頭部、および、最後尾の処理はどうなっているのでしょうか。
あと、
>struct buf temp;
>struct buf *restart1=&temp;
の部分ですが、この部分の処理に?となってしまいました。
このデータ構造の場合、tempを使わず、main()の始めのほうでmalloc()した領域をrestart1に設定するのが相場なので。
再度ご回答ありがとうございます。
私自身未熟なので四苦八苦しながら作っているので、プログラムに自信がまったくないので、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さん丁寧なご回答ありがとうございました。
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へのコピーは行われているのでしょうか?
回答ありがとうございます。
確かに(1)は必要ないですね^^;
補足として初期設定でmain内で
resenddata=restart;
restart->nest=NULL;
を行っています。
未熟なためいろいろおかしいかと思いますが引き続き募集させていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
InvokeMemberメソッドとは何を...
-
isset — 変数が宣言されている...
-
双方向リストのバブルソートに...
-
「Aに対するBの割合」と「Aに対...
-
2÷3などの余りについて
-
Aの値からBの値を除するとは??
-
プログラミング C言語 課題でプ...
-
Enterキーを押されたら次の処理...
-
20'(角度)の計算がわかりま...
-
C言語のfor文です。 繰り返しの...
-
#if 1 #elseの意味について
-
main.c:7:43: warning: implici...
-
ある商品のロス率を5%見込み、...
-
数字以外が入力されたらエラー...
-
str系関数を使わずに二つの文字...
-
#define _CRT_SECURE_NO_WARNIN...
-
信頼区間の1.96や1.65ってどこ...
-
文字列から空白を取り除きたい...
-
エラー「invalid conversion fr...
-
三角分布に従う乱数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体のリスト削除
-
C# ref引数のnull判定
-
ばばぬきプログラムについて
-
双方向リストのバブルソートに...
-
C♯ 2段構造のcontextMenuStrip?
-
InvokeMemberメソッドとは何を...
-
isset — 変数が宣言されている...
-
別formの多重起動防止
-
バブルソートを使って文字列を...
-
今度はdoubly linked listの問...
-
空のカラムを挿入
-
コールバック関数はnullになら...
-
構造体について
-
「Aに対するBの割合」と「Aに対...
-
Aの値からBの値を除するとは??
-
Enterキーを押されたら次の処理...
-
複数桁10進数の*桁目だけを抽出...
-
main.c:7:43: warning: implici...
-
C言語での引数の省略方法
-
エクセルで可視セルにのみ値貼...
おすすめ情報