ここから本文です

NULLポインタを参照してはいけないのですか?

桜花 ‐おうか‐さん

2014/6/208:56:47

NULLポインタを参照してはいけないのですか?

閲覧数:
729
回答数:
4

違反報告

ベストアンサーに選ばれた回答

2014/6/217:58:40

ポインタという用語からC/C++に限定していいのかしら。

C/C++では、言語レベルでは禁止はしていない。けれど、NULLポインタは「どこも指していないポインタ」なので、ポイント先を参照することに本質的に意味がない。

実装上はポインタのアドレス値が0の場合を「どこも指していない」とする取り決めによっているので、参照すると存在するアドレス0に対してアクセスが発生する。
OS上のプログラムで、OSがメモリ管理をしっかりしていれば、例外が発生して、プログラムが叩き落とされるかもしれない。その場合は、システムによってNULLポインタのポイント先へのアクセスが禁止されているということにはなる。

OS自体や、OS無しで動くようなプログラムの場合には、意図的にアドレス0へのアクセスが発生する場合もある。動作上はNULLポインタのポイント先へのアクセスと区別は出来ないけれど、「意味」としてはNULLポインタではないのでこれは話を別に論じるべきかと。

質問した人からのコメント

2014/6/8 19:28:56

驚く >意図的にアドレス0へのアクセスが発生する場合もある
まじで

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

アバター

ID非公開さん

2014/6/219:30:56

いい質問ですね。

先の方も言われてますが、C言語ではNULLポインタの参照は禁じられてません。
参照してもいいのです。
ただし、その後システムの挙動がどうなるかをC言語は保障していないだけです。

システム(普通はOSですね)はその貫徹性を維持するため、プログラムが不正なアドレス(この場合はNULLですね)をブロックする仕組みを備えておくべきなんでしょう。

ただ、参照してはイケないと言われているのは、プログラマーとしての最低限のマナー(バグを減らす)として言われているだけだと思います。

だから、ポインタを引数とする関数を作る場合

void func( int *p )
{
if( p == NULL )
retturn;

・・・・

}

といった具合に、ポインタがNULLかどうかをチェックするのはマナーであると思いますが。

k03********さん

2014/6/212:01:54

chiebukuro_yamerubekiさん

何をしたいか、書く。

久遠人さん

2014/6/209:30:49

別に悪くはないけど、大抵のOSでは0番地以降には壊されてはまずいコードがロードされているので、ユーザープログラムがアクセスできないようにプログラミングされている

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる