回答編集履歴

1

加筆修正

2016/11/16 00:31

投稿

majiponi
majiponi

スコア1720

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
  ```