回答編集履歴
1
加筆修正
test
CHANGED
@@ -18,7 +18,17 @@
|
|
18
18
|
|
19
19
|
|
20
20
|
|
21
|
-
2つ目は、枝の先がない場合の処理です。19を探したときにセグメンテーションフォルトというものが出たと思いますが、これは、アクセスしてはいけない場所をアクセスした、という情報です。例えば、メモリの0番地は、BIOSという別のプログラムがいて、勝手に触ってはいけないことになっています
|
21
|
+
2つ目は、枝の先がない場合の処理です。19を探したときにセグメンテーションフォルトというものが出たと思いますが、これは、アクセスしてはいけない場所をアクセスした、という情報です。例えば、メモリの0番地は、BIOSという別のプログラムがいて、勝手に触ってはいけないことになっています(例外あり)。
|
22
|
+
|
23
|
+
プログラムの他の部分で、ポインタにNULLを代入している場所がありますよね? このNULLはヌルポインタと呼ばれ、C言語では「触ってはいけない場所」を意味しています。この中身にアクセスしようとすると、フォルトが発生します。
|
24
|
+
|
25
|
+
今回、枝の先を探していくと、枝の先がヌルポインタになっていることがあります。この中身を触ろうとしたため、フォルトが発生して異常終了したのです。
|
26
|
+
|
27
|
+
では、どうすればいいのか。簡単です。「中身に」触らなければいいのです。pがヌルポインタの場合はそれ以上探索せず、見つからなかったと報告するようにすればいいのです。
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
これらを踏まえると、次のコードのようになります。
|
22
32
|
|
23
33
|
```C
|
24
34
|
|
@@ -26,7 +36,7 @@
|
|
26
36
|
|
27
37
|
if (p == NULL)
|
28
38
|
|
29
|
-
return 0;
|
39
|
+
return 0; // 2番目の問題を修正
|
30
40
|
|
31
41
|
|
32
42
|
|
@@ -42,6 +52,8 @@
|
|
42
52
|
|
43
53
|
return search_tree(x, p->right);
|
44
54
|
|
55
|
+
// 1番目の問題を修正
|
56
|
+
|
45
57
|
}
|
46
58
|
|
47
59
|
```
|