卒論でプログラム作成しているのですが、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.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;
を行っています。
未熟なためいろいろおかしいかと思いますが引き続き募集させていただきます。
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さん丁寧なご回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語 leetcode21 Merge Two Sorted Lists 2 2022/04/24 19:35
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# leetcode21 1 2022/04/21 11:53
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Excel(エクセル) vba シート名の一覧を2列に分けるには 5 2023/04/24 08:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# ref引数のnull判定
-
構造体のリスト削除
-
連結リストをソート
-
InvokeMemberメソッドとは何を...
-
API 録音 MCI
-
バブルソートを使って文字列を...
-
Enterキーを押されたら次の処理...
-
数字以外が入力されたらエラー...
-
「指定されたキャストは有効で...
-
fgetsなどのときのstdinのバッ...
-
マイナスからプラスへ転じた時...
-
2÷3などの余りについて
-
複数桁10進数の*桁目だけを抽出...
-
*をユーザーが入力した数字の数...
-
#define _CRT_SECURE_NO_WARNIN...
-
float型とdouble型の変数の違い...
-
C言語で簡単なパックマンゲーム...
-
C言語での引数の省略方法
-
4の倍数を論理演算で表す。。
-
エクセルで可視セルにのみ値貼...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
InvokeMemberメソッドとは何を...
-
構造体のリスト削除
-
C# ref引数のnull判定
-
双方向リストのバブルソートに...
-
コールバック関数はnullになら...
-
今度はdoubly linked listの問...
-
C♯ 2段構造のcontextMenuStrip?
-
空のカラムを挿入
-
C#でのEXCEL出力に関して
-
「Nz」は何て読むのでしょうか?
-
ソートを自作
-
ばばぬきプログラムについて
-
バブルソートを使って文字列を...
-
ポインタを使った連結リストへ...
-
C言語 dequeue
-
API 録音 MCI
-
マイナスからプラスへ転じた時...
-
Enterキーを押されたら次の処理...
-
2÷3などの余りについて
-
C言語での引数の省略方法
おすすめ情報