質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1737閲覧

returnとexitから起こるエラー

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/05/23 06:04

課題で登録された名前、番地を要素としたリスト構造からなるリストを、名前で検索する関数SearchListを作成しています。もし一致するものがあれば番地である変数idを返し、それ以外は何も返さないという関数です。
ただ、この状態で関数を使用するとSegmentation faultになってしまいます。exitの使い方があまり分かっていないため、このような使い方でよいのか教えていただきたいです。よろしくお願いいたします。

C

1int SearchList(node *list, char *id) { 2 node *p = list->next; 3 4 while(p != NULL) { 5 if((strcmp(p->id, id)) == 0) { 6 return (p->num); 7 } 8 p = p->next; 9 } 10 printf("ident not find.\n"); 11 exit(0); 12} 13 14/*node = リスト構造*/ 15typedef struct _node{ 16 char id[15]; 17 int num; 18 struct _node *next; 19}node;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SHOMI

2020/05/23 06:19

関数を呼んでいる側のコードも貼って下さい
Zuishin

2020/05/23 06:24

list か id が NULL か不正なアドレスを指しているんじゃないでしょうか。そうでなければ各ノードの初期化に失敗しているか。
KoichiSugiyama

2020/05/23 06:28

SearchListの引数に何を渡しているか判らないと何とも言えません。呼び出し側の処理も開示してみてください。
pepperleaf

2020/05/23 06:45

そもそもノードを初期化してない。そのため、 > while(p != NULL) { のループを抜けることが無く、不正アクセスになるとか、、。
thkana

2020/05/23 07:01

segmentation faultとexit()はどのように結びつくのでしょうか。 他の間違いの結果としてならともかく、returnやexit()がsegmentation faultの原因になることは非常に考えにくいです。
episteme

2020/05/23 10:09

> int SearchList(node *list, char *id) こいつに引き渡すlistがNULLだったらおかしなことが起こりそうですが...
cateye

2020/05/23 11:21

コンパイラは何でしょう? printf()でも入れてlistの値を確認しましょう。
guest

回答1

0

ベストアンサー

return:上位に戻り値を返す
exit:即時終了(プログラムが落ちる)
となります。

「もし一致するものがあれば番地である変数idを返し、それ以外は何も返さないという関数」
で、「それ以外は何も返さない」の実現はC言語だと難しいかと。
(longjmpを使えば無理くり実現できますが、あまり美しくないと思います。C++ならthrowなどでハンドリングできるんですけどね。)

こういう場合、

exit(0);

ではなく、

return NULL_PTR;

で、NULL_PTRを返し、上位側では戻り値がNULL_PTRの時に
エラーハンドリングするような構成にした方が、素直かと思います

投稿2020/06/12 04:47

takayukid

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問