- 締切済み
C言語の勉強中です
C言語の勉強中です。自分の参考にしている本でよくわからないところがあったので教えてください 本には、NULLポインタは、すべてのビットが0であり、どこのアドレスも指さないポインタのことと書いてあるのですが、アドレスは0から始まるから、実際はアドレスの0番地を指していますよね? どこのアドレスも指さないと言いつつ、実際は0番地を指しているあたりがよくわかりないので教えてください
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- jjk65536
- ベストアンサー率59% (66/111)
Linuxでは0番地からの最初の1ページはR/Wの禁止フラグが立っていることが保証されているため、 読み書きしようとすると、Kernelが不正アクセスを捕捉します。 NULLは(void*)0ですから、誤ってアクセスがあった場合に確実に検出できるようになっているのです。 Kernelが不正アクセスを捕捉すると何がおきるのか 1. 標準エラー出力に「Segmentation fault」と表示する 2. SIGSEGVシグナルを発行し、プログラムに不正アクセスがあったことを通知 このように、NULLが0番地であると都合がいいので一般的には0番地を指すようになっています。 また、メモリに関するマジックナンバーでは、以下の記事なんかも面白いですよ。 Wikipedia Hexspeak http://ja.wikipedia.org/wiki/Hexspeak
No.5です。 「0番地アクセス」と書きましたが、読み込みは大丈夫ですね。 ですから、0番地への書き込みと0番地ジャンプは異常終了します。
これは、たとえばコンピュータは「0と1からなる」と言うのと同じようなものです。 最近では、バイオコンピュータのようなものも研究されていますので、すべてがすべてではありません。 それと同じようなもので、勉強として理解する分には、それが正しいと思って支障はありません。 つまり、普通の人がC言語を覚える環境は、MS-Windows,Mac,Linuxぐらいでしょう。 その場合、0番地をアクセスした途端(何もしなければ)必ず異常終了(実際には割り込み)します。 つまり、0番地は無効な番地となるため、その意味で便宜的に「どこも指さない」と言っているのです。 それよりも重要なことは、C言語の怖さはあまりに何でも記述できてしまうため、0番地にアクセスするだけで簡単に異常終了するプログラムが、意識・無意識に関わらず簡単にできてしまうことで、仕事でやっている人でさえこれで苦しめられるのです。 結論としては、0番地にアクセスするプログラムは、普通は存在しないため、あくまで「便宜的」にそのように言っているだけです。 もちろん、0番地からと言うのは合っています。 また、さらに言えばMS-Windows,Mac,Linuxは一般アプリケーションは仮想メモリー上で動作するため、0番地と言ってもあくまで、仮想番地の話です。
- jacta
- ベストアンサー率26% (845/3158)
> 本には、NULLポインタは、すべてのビットが0であり、どこのアドレスも指さないポインタのことと書いてあるのですが、 そんな本は燃やしてください。 NULLは空ポインタ定数に展開されます。 空ポインタ定数は、値ゼロを持つ整数定数またはそれをvoid*にキャストしたものですが、内部表現が全ビットゼロであるかどうかは処理系に依存します。 プロセッサの0番地は、アーキテクチャによってどんな意味に使われるかさまざまですが、よくあるケースでは、リセットベクタやリセットハンドラであったり、RAMであったりします。MMUがある場合には、通常、TLB等によって自由に物理アドレスをマッピングできます。 ものによっては、0番地に制御レジスタやアキュムレータなどのレジスタが配置されたりします。 ですので、プロセッサの0番地は必ずしも使用しないアドレスではないのです。 ただし、そのような状況であっても、わかりやすさから(危険を承知で)空ポインタの内部表現な全ビットゼロになるような実装がほとんどです。 だからといって、処理系を特定せずに一般論としてそんな話をすることはできませんし、ましてやCの入門書が特定の実装を前提として、それが普遍的な事実であるかのように書くのは論外です。
- D-Matsu
- ベストアンサー率45% (1080/2394)
> NULLポインタは、すべてのビットが0であり、どこのアドレスも指さないポインタのこと その処理系で「何も指さないポインタ」を意味する値としてたまたま0を使っているだけですから、その本の記述が間違っているのです。 今となってはまず見ることはないでしょうが、場合によっては0でない値がNULLになることもあります。
- kmee
- ベストアンサー率55% (1857/3366)
処理系によっては [NULLポインタは、すべてのビットが0]とは限りません。他の値になっている場合もあります。 ポインタの値が実際のメモリ空間の番地であるとも限りません。 なので、0という値に固執するのは無意味です。 それでもわからなければ... NULLポインタは特定のアドレスを指す。 しかし、そのアドレスは特別なアドレスで、通常のポインタの様に読み書きできない。 「何も指さないポインタ」を表現する時に、通常のポインタでは使えないアドレス、というは都合がいい(何かを指すポインタとは重複しない)ので、NULLを「何も指さないポインタ」と解釈するようにシステムを設計することにした。 くらいに考えて。
- KAZUMI2003
- ベストアンサー率37% (77/208)
NULLは、どこも指していない=意味の有るところを指していない、という意味です。 意味のないポインタを表すために、「便宜上」0となっているだけです。そういう意味では、 「-1」とかでも良かったのかも知れませんが、色々なことを考えて0に決めたのでしょう。 コンピュータシステムにおいて、本当は「0」は別に意味のない場所ではないのですが、unixでは、そこは使われていなかった為、それに由来すると聞いたことがあります。 それに、頻繁に比較する値として0は、色々と都合がいいのです。