みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語 メモリは何番地から何番地まであるのか

C言語 メモリは何番地から何番地まであるのでしょうか?
パソコンによって違うのでしょうか?
C言語のプログラムではどうやって調べればよいでしょうか。

投稿日時 - 2018-02-20 23:24:32

QNo.9431066

困ってます

質問者が選んだベストアンサー

 それをプログラムから調べる方法は、ありません。
 メモリーの大きさ、番地の表現方法、番地を表す数字の大きさ(アドレス幅)等々は、全部、CPUによって変わります。
 アドレス幅が8ビットで、1~256番地なんて、時代もありましたし、今や、物理メモリーはOSに支配されているので、プログラムから、物理メモリーアドレスに触れることすら不可能です。
 ちなみに、mallocや配列で最大どれだけのメモリーが確保できるかは、OSかコンパイラーの処理系のマニュアルに記載があり、それを超える要求をしたら、mallocかコンパイラーがエラーを返しますから、それは判定することが出来ます。

 いまでも、マイコン(いわゆる組み込み用のチップですね)では、物理メモリーアドレスそのものを意識して、プログラムすることは多々ありますが、その場合は、CPUのマニュアルを首っ引きで、アドレスをマニュアルから調べながらプログラムします。つまり、この場合でも、Cのプログラムから調べることはありません。

 基本的なスタンスとしては、ポインターの中に何が入っているかは一切気にしない。メモリーを割り当てる時は、スタテックに宣言するか、malloc等で取得する。といったアプローチになります。そして、いずれも、宣言した・取得した時に要求した大きさ以上のものは使わないように自分で管理するものです。
 ただし、一つだけお約束があります。ポインターは、連続した整数で構成されている様に見える、つまり、ポインターに対して、整数を加減算することは、自然に評価されるということだけは保証されています。
 保証されていることは、それだけです。

 実際、ポインターをintなりlongなりに変換して、中身を覗けば、それがメモリリーアドレスかというと・・・今時のパソコンのOSなら、ほぼ間違いです。ただ、そのプログラムがOSとメモリー番地に関してやりとりするためだけにある論理的なアドレスである可能性の方が高いです。ポインターの実装によっては、理論上、intやlongに変換できない可能性すらあります。(例えば、ブロック番号とオフセットで構成されている等等)

投稿日時 - 2018-02-22 21:34:19

お礼

回答有難うございます。

投稿日時 - 2018-02-22 23:54:25

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

「メモリ」が何番地から何番地まであるのか、となると難しいですね。
「アドレス」が何番地から何番地ということですと、CPUのアドレス幅で決まります。
昔の8ビットパソコンなんかだと、アドレスが16ビットなので、
0~FFFF
までのアドレスがあることになります。
しかし、メモリがどこからどこまであるのかはまた別です。
ROMとかRAMとかVRAMとかもありますしね。
バンク切り替えなんてのがあると、もっとややこしいです。
メモリマップトIOとか・・・。
まあ、このあたりはC言語の仕様ではなくて、パソコンの機種ごとに違った話です。
C言語から調べる方法もありません。

これが現代の64ビットパソコンになりますと、アドレスが64ビットですから、
0~FFFFFFFFFFFFFFFF
までのアドレスがあります。
で、これが全部メモリで埋まっているかというと、そうともいえるし、そうでないともいえる、という状態です。「仮想記憶」という仕組みなのですが。

いずれにせよ、OS上でプログラムを動かす場合には、何番地から何番地ということは意識せずとも良いようになっていますし、調べる方法も用意されていません。

組み込み系の場合は、意識することもありますが、その場合もC言語から調べるというよりは、ハードウェアの仕様書を調べるということになると思います。

投稿日時 - 2018-02-22 11:52:32

お礼

回答有難うございます。

投稿日時 - 2018-02-22 23:56:11

ANo.2

それはOSの仕事ですが。。。

OS他のプログラムに割り当てているエリアを、勝手にスタティックでプログラムがアサインしたらどうなるかわかると思いますけど。
もちろん、スタティックでアサインする方法もありますが、それはプロセスの違うプログラムとのやる取りをするなどの場合に使う手ですね。
その場合でも、OSから割り当ててもらうのには変わりはありません。


>パソコンによって違うのでしょうか?

それじゃ、パソコンごとにプログラム作るのでしょうか?
世の中ノーパソコンの機種をみんな調べないといけないですし、ソフトをリリースした後に発売されたパソコンにはどの様に対処しましょうねぇ?

そうやって考えればわかると思いますが。。。


C言語の特徴になるポインタってものが理解できていれば、その辺もわかりやすいと思うのですけどね。

投稿日時 - 2018-02-21 00:36:56

お礼

回答有難うございます。

投稿日時 - 2018-02-21 22:39:42

ANo.1

プラットホームにより異なりますし調べる方法もプラットホームにより異なります。

投稿日時 - 2018-02-20 23:33:30

お礼

回答有難うございます。

投稿日時 - 2018-02-21 22:38:21

あなたにオススメの質問