ヌルポインタの話 「尻 が null でした。」 ( No.61 ) |
- 日時: 2023/03/26 12:02
- 名前: REDCHEEKS
- >>59 のコラムで、封印された技術、ポインタの話をしたが、封印されたとはいえ、今でも一部エラーになることがあるんだな。
それがヌルポインタなんだ、よく出るエラーなので、説明するよ。
まず、説明のために、わざとエラーを出してみよう。
http://mediasp.kir.jp/img20220326/imgloglog-box/img20230326120104.png
@ 課題H の、人クラス内で、 protected けつ 尻 = new けつ(); の先頭に、// を書き込み、プログラムをコメント化(無効化)する。 そして次の行に、 protected けつ 尻; と書き込む。
A 「課題H」ボタンをクリックし、プログラムを起動する。
B 男クラスのおしおき()メソッド内の、尻.ぺんぺん(); の行が反転表示され、赤色で × が表示され、ブログラムが停止する。 表示されるエラーメッセージは以下の通り、
> 例外がスローされました > System.NullReferenceException: 〜 > 尻 が null でした。
(解説は次回)
|
ヌルポインタの話 「尻 が null でした。」 (解説) ( No.62 ) |
- 日時: 2023/03/29 10:49
- 名前: REDCHEEKS
- >>61 の続き(解説)
そもそも、 protected けつ 尻 = new けつ();
というブログラム、左辺にも右辺にも尻やけつがあって、尻の臭いプンプン、何をしているやらよくわからないという人への補足説明も兼ねて、ヌルポインタの話を続けよう。
そもそもこのプログラム、1行に書いているが、やっていることは2つ、以下の (a) (b) の2つに分けた方が分かりやすいだろう。
(a) protected けつ 尻;
(b) 尻 = new けつ();
************** まず (a) について、 **************
これは "尻" という名前の、ポインタを定義している。
ここで、protected は、公開範囲で、今回の話題とは直接関係ないが、身内内での公開を意味する。
"尻" は、実際のデータが保存されている場所を示すポインタである。 初期値は、ゼロ(ヌル)である。
"けつ" は尻のデータ構造を示すクラス(設計図)で、右尻、左尻、ぺんぺんなどの要素が定義されている。
※ "尻" ポインタが指し示すデータをアクセスするときは、"けつ" クラスで定義されている構造(テンプレート)を当てはめて今後解釈する。
************** 次に (b) について、 **************
尻のデータ構造を示すクラス(設計図)である "けつ" に従い、メモリ領域を実際に確保し初期化(new)したのち
その位置を尻(ポインタ)に設定している。
※ これにより、尻ポインタからたどって、右尻、左尻、さらにそれらの色を記憶するメモリ領域が確保されたわけだ。
****************** なぜエラーになったか? ******************
>>61 でやったことは、(a) だけにしてしまったからだ。
つまり(b) がなくなった結果、尻(ポインタ)は、初期値ゼロ(ヌル)のままとなり、尻ポインタからたどって、右尻、左尻、さらにそれらの色を記憶するメモリ領域をアクセスしようとする処理が不可能になったのだ。
|
ヌルポインタの話 尻 ++; ( No.63 ) |
- 日時: 2023/03/30 22:50
- 名前: REDCHEEKS
- >>62 の続き
でも、昔のC言語は、もっと危険だったんだな。
尻ポインタの値を+1するなど変更して、つまり、
********** 尻 ++; **********
これで、隣の尻をさわりに行く事もできたんだ。
C言語は非常に速く、何でもできるんだけど危険で、1つ間違えると、データを破壊しシステムを停止させてしまうんだ。
|
ヌルポインタの話 (Hな課題) ( No.64 ) |
- 日時: 2023/03/28 01:28
- 名前: REDCHEEKS
- まず、>>61 で加えた変更を元に戻し、エラーが出ない状態に戻そう。
次に、REDCHEEKS のちんちんを null にして、試してみよう(ちんちん が null でした。)
|