• 締切済み

C言語の勉強中です

C言語の勉強中です。自分の参考にしている本でよくわからないところがあったので教えてください 本には、NULLポインタは、すべてのビットが0であり、どこのアドレスも指さないポインタのことと書いてあるのですが、アドレスは0から始まるから、実際はアドレスの0番地を指していますよね? どこのアドレスも指さないと言いつつ、実際は0番地を指しているあたりがよくわかりないので教えてください

みんなの回答

  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.7

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

全文を見る
すると、全ての回答が全文表示されます。
noname#140082
noname#140082
回答No.6

No.5です。 「0番地アクセス」と書きましたが、読み込みは大丈夫ですね。 ですから、0番地への書き込みと0番地ジャンプは異常終了します。

全文を見る
すると、全ての回答が全文表示されます。
noname#140082
noname#140082
回答No.5

これは、たとえばコンピュータは「0と1からなる」と言うのと同じようなものです。 最近では、バイオコンピュータのようなものも研究されていますので、すべてがすべてではありません。 それと同じようなもので、勉強として理解する分には、それが正しいと思って支障はありません。 つまり、普通の人がC言語を覚える環境は、MS-Windows,Mac,Linuxぐらいでしょう。 その場合、0番地をアクセスした途端(何もしなければ)必ず異常終了(実際には割り込み)します。 つまり、0番地は無効な番地となるため、その意味で便宜的に「どこも指さない」と言っているのです。 それよりも重要なことは、C言語の怖さはあまりに何でも記述できてしまうため、0番地にアクセスするだけで簡単に異常終了するプログラムが、意識・無意識に関わらず簡単にできてしまうことで、仕事でやっている人でさえこれで苦しめられるのです。 結論としては、0番地にアクセスするプログラムは、普通は存在しないため、あくまで「便宜的」にそのように言っているだけです。 もちろん、0番地からと言うのは合っています。 また、さらに言えばMS-Windows,Mac,Linuxは一般アプリケーションは仮想メモリー上で動作するため、0番地と言ってもあくまで、仮想番地の話です。

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

> 本には、NULLポインタは、すべてのビットが0であり、どこのアドレスも指さないポインタのことと書いてあるのですが、 そんな本は燃やしてください。 NULLは空ポインタ定数に展開されます。 空ポインタ定数は、値ゼロを持つ整数定数またはそれをvoid*にキャストしたものですが、内部表現が全ビットゼロであるかどうかは処理系に依存します。 プロセッサの0番地は、アーキテクチャによってどんな意味に使われるかさまざまですが、よくあるケースでは、リセットベクタやリセットハンドラであったり、RAMであったりします。MMUがある場合には、通常、TLB等によって自由に物理アドレスをマッピングできます。 ものによっては、0番地に制御レジスタやアキュムレータなどのレジスタが配置されたりします。 ですので、プロセッサの0番地は必ずしも使用しないアドレスではないのです。 ただし、そのような状況であっても、わかりやすさから(危険を承知で)空ポインタの内部表現な全ビットゼロになるような実装がほとんどです。 だからといって、処理系を特定せずに一般論としてそんな話をすることはできませんし、ましてやCの入門書が特定の実装を前提として、それが普遍的な事実であるかのように書くのは論外です。

全文を見る
すると、全ての回答が全文表示されます。
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

> NULLポインタは、すべてのビットが0であり、どこのアドレスも指さないポインタのこと その処理系で「何も指さないポインタ」を意味する値としてたまたま0を使っているだけですから、その本の記述が間違っているのです。 今となってはまず見ることはないでしょうが、場合によっては0でない値がNULLになることもあります。

全文を見る
すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

処理系によっては [NULLポインタは、すべてのビットが0]とは限りません。他の値になっている場合もあります。 ポインタの値が実際のメモリ空間の番地であるとも限りません。 なので、0という値に固執するのは無意味です。 それでもわからなければ... NULLポインタは特定のアドレスを指す。 しかし、そのアドレスは特別なアドレスで、通常のポインタの様に読み書きできない。 「何も指さないポインタ」を表現する時に、通常のポインタでは使えないアドレス、というは都合がいい(何かを指すポインタとは重複しない)ので、NULLを「何も指さないポインタ」と解釈するようにシステムを設計することにした。 くらいに考えて。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

NULLは、どこも指していない=意味の有るところを指していない、という意味です。 意味のないポインタを表すために、「便宜上」0となっているだけです。そういう意味では、 「-1」とかでも良かったのかも知れませんが、色々なことを考えて0に決めたのでしょう。 コンピュータシステムにおいて、本当は「0」は別に意味のない場所ではないのですが、unixでは、そこは使われていなかった為、それに由来すると聞いたことがあります。 それに、頻繁に比較する値として0は、色々と都合がいいのです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 入門より少し進んだC言語の勉強方法

    初めまして。 現在、C言語の勉強をしています。 C言語入門用の本を2~3冊読み、実際に自分で書いてみて関数やポインタ、構造体などの初歩的な事は理解しました。 また、基本情報技術者試験をC言語で受験し、合格する事が出来ました。 しかし、基本情報技術者試験に出てくるプログラミングの問題を読み、どのような動作をするのか追いかける事は出来ますが、似たようなレベルのプログラムを「自分で1から書けるか」と言われたら難しいと思います。 入門用の本を卒業し、次のステップに進みたいと思うのですが、どのように勉強すればいいのかよく分からず、止まってしまっている状態です。 ぜひ、今後におけるおすすめの勉強方法がありましたら教えてください。 宜しくお願いします。

  • C++の勉強を始めたいと思っています。

    C++の勉強を始めたいと思っています。 C言語の経験はあるので、そのあたりから始められるとっつきやすい参考書でお勧めはないでしょうか。 この本の途中からがいいよというのでもかまいません。

  • C言語の勉強方法

    こんにちは。 今C言語の勉強方法で悩んでいます。 私のC言語暦は、大学の授業の時に、文法一通りを覚えました。(当時はオセロゲームの次の一手を考えるようなアプリを作りました。) ポインタに関しては、柴田望洋さんの「C言語ポインタの極意」という本を少し読みました。ぼんやりと理解しているような状態です。K&Rの本は概ね理解できます。(演習問題はやっていません。) 仕事としてしているわけではなく、本はいろいろ読んでいるのですが、あまり自分でサンプルコードを打ってみたりはしていません。演習問題も解いていません。 APIに関する知識は乏しいです。アルゴリズムとデータ構造は、ヒントがないと、自力では書く自信がありません。基本情報処理技術者の資格も持っていません。 こういったレベルですが、これからどういった勉強をすればいいでしょうか?アドバイスを頂けるとありがたいです。

  • C言語を勉強したいです。

    こんばんは。 いきなりですが、C言語を勉強したいと思っています。 今回初めて言語を勉強するので、本を見ながら勉強したいと思っているのですが、C言語に関する本が多すぎてよく解りません。 「0からの初心者にはこの本解りやすいよ!」、「この本なら解らないときに○○の掲示板で情報交換できたりするよ!」なんて情報がありましたら、是非教えていただけないでしょうか? よろしくお願いします。

  • C言語 よく使うのは?

    C言語の参考書で、例えば1章~8章まであるとすると、 1章~前半くらいは、printfや変数や、演算など出てきると思うんですが、後半にかけて、配列やポインタや関数など出てくると思います。 実際に仕事で、よく使うのを挙げるとどんなのですか?(例えば、ポインタはよく使うや配列もよく使うや) もちろん、変数や演算などが出来ないと条件分岐や配列もポインタも何も出来ないと思うんですが、 上手く言えないんですが、for文はよく使うから、ちゃんと理解していないとダメとか、仕事ではポインタがしょっちゅう使うとか、ありますか? 本屋さんで見ると、ポインタ専用の本や、関数専用の本があるので、よく使うのかなと思いました。 それか、難しく理解が難しいから、より詳しく書かれているんでしょうか? 上手く説明が出来ていないですが、よろしくお願いします。

  • C言語の勉強にあたって

    今からC言語を勉強していく人から質問されたのですが、勉強にあたって、Cのアプリケーション(コンパイラ等)なしに実際のプログラムの動きを勉強する方法はないでしょうか? これでは漠然とした書き方ですが、例えば、インターネットのHP上でプログラミング→コンパイル→実行をシミュレーションできるようなHPはないでしょうか? こういうHPがあると、とりあえずインターネット環境とC言語の参考書があれば簡単に勉強できると思うんです。 そのようなHP、ありましたら教えてください。 何ヶ所かあるようでしたら、使い方が難しくない(初心者向け)ところが良いです。 よろしくお願いします。

  • c言語

    ポインタではない型名 変数名=(void *) 0; 上記コードですべての処理系で、変数の中身がすべてビット0であるということはc言語規格で保証されていないという認識は正しいですか?

  • C言語の勉強法

    C言語の勉強をしたい、そう決意をしましたが、勉強方法がイマイチ分かりません。勉強方法を教えてください。 例えば、このサイトや本を参考にして勉強するとか、どの関数から勉強すればいいとか。 よろしくお願いします。

  • C言語の参考書を探しています。

    ご回答のほうよろしくお願いします。 早速ですが、私は只今、職業訓練校にてC言語を習っています。 しかし、色々と勉強しているうちに何個か分からなくなることがありまして、それについて詳しく書いてある本かHPが欲しいなと思いまして、質問させて頂きました。 それで内容ですが、 ・標準関数について使い方と内容を詳しく記載してある本が欲しいのです。 HPやペルプを使っても私にはちょっと分かり難いのでその部分を重点的に記載しているとありがたいです。 ・またC言語の関数の作り方、ポインタの使い方も詳しく書いてある本も欲しいです。 ・それとこれは別で、再度初歩的な部分の勉強したいと思いますので、初心者の参考書も欲しいと思っています。 と色々と要望が多いですが、よろしくお願いします。 ちなみに全部に言えることですが私はMicrosoft Visual C++ 6.0を使っているのでそれに精通した本でお願いします。

  • C言語を勉強中で・・・・

    現在C言語を参考書を読みながら勉強しています。 ですが参考書を読むだけではいまいち理解が出来ないので実際にパソコン上でプログラムを実行してみたいと思いました。 そこで初心者でも扱いやすい無料のコンパイラを探しています。 出来ればダウンロードやインストール等も簡単でわかりやすいととても助かるのですが何方かご存知の方はいませんか? よろしくお願いします。