• ベストアンサー

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

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

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

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.4

 それをプログラムから調べる方法は、ありません。  メモリーの大きさ、番地の表現方法、番地を表す数字の大きさ(アドレス幅)等々は、全部、CPUによって変わります。  アドレス幅が8ビットで、1~256番地なんて、時代もありましたし、今や、物理メモリーはOSに支配されているので、プログラムから、物理メモリーアドレスに触れることすら不可能です。  ちなみに、mallocや配列で最大どれだけのメモリーが確保できるかは、OSかコンパイラーの処理系のマニュアルに記載があり、それを超える要求をしたら、mallocかコンパイラーがエラーを返しますから、それは判定することが出来ます。  いまでも、マイコン(いわゆる組み込み用のチップですね)では、物理メモリーアドレスそのものを意識して、プログラムすることは多々ありますが、その場合は、CPUのマニュアルを首っ引きで、アドレスをマニュアルから調べながらプログラムします。つまり、この場合でも、Cのプログラムから調べることはありません。  基本的なスタンスとしては、ポインターの中に何が入っているかは一切気にしない。メモリーを割り当てる時は、スタテックに宣言するか、malloc等で取得する。といったアプローチになります。そして、いずれも、宣言した・取得した時に要求した大きさ以上のものは使わないように自分で管理するものです。  ただし、一つだけお約束があります。ポインターは、連続した整数で構成されている様に見える、つまり、ポインターに対して、整数を加減算することは、自然に評価されるということだけは保証されています。  保証されていることは、それだけです。  実際、ポインターをintなりlongなりに変換して、中身を覗けば、それがメモリリーアドレスかというと・・・今時のパソコンのOSなら、ほぼ間違いです。ただ、そのプログラムがOSとメモリー番地に関してやりとりするためだけにある論理的なアドレスである可能性の方が高いです。ポインターの実装によっては、理論上、intやlongに変換できない可能性すらあります。(例えば、ブロック番号とオフセットで構成されている等等)

purogu2017
質問者

お礼

回答有難うございます。

その他の回答 (3)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

「メモリ」が何番地から何番地まであるのか、となると難しいですね。 「アドレス」が何番地から何番地ということですと、CPUのアドレス幅で決まります。 昔の8ビットパソコンなんかだと、アドレスが16ビットなので、 0~FFFF までのアドレスがあることになります。 しかし、メモリがどこからどこまであるのかはまた別です。 ROMとかRAMとかVRAMとかもありますしね。 バンク切り替えなんてのがあると、もっとややこしいです。 メモリマップトIOとか・・・。 まあ、このあたりはC言語の仕様ではなくて、パソコンの機種ごとに違った話です。 C言語から調べる方法もありません。 これが現代の64ビットパソコンになりますと、アドレスが64ビットですから、 0~FFFFFFFFFFFFFFFF までのアドレスがあります。 で、これが全部メモリで埋まっているかというと、そうともいえるし、そうでないともいえる、という状態です。「仮想記憶」という仕組みなのですが。 いずれにせよ、OS上でプログラムを動かす場合には、何番地から何番地ということは意識せずとも良いようになっていますし、調べる方法も用意されていません。 組み込み系の場合は、意識することもありますが、その場合もC言語から調べるというよりは、ハードウェアの仕様書を調べるということになると思います。

purogu2017
質問者

お礼

回答有難うございます。

noname#252929
noname#252929
回答No.2

それはOSの仕事ですが。。。 OS他のプログラムに割り当てているエリアを、勝手にスタティックでプログラムがアサインしたらどうなるかわかると思いますけど。 もちろん、スタティックでアサインする方法もありますが、それはプロセスの違うプログラムとのやる取りをするなどの場合に使う手ですね。 その場合でも、OSから割り当ててもらうのには変わりはありません。 >パソコンによって違うのでしょうか? それじゃ、パソコンごとにプログラム作るのでしょうか? 世の中ノーパソコンの機種をみんな調べないといけないですし、ソフトをリリースした後に発売されたパソコンにはどの様に対処しましょうねぇ? そうやって考えればわかると思いますが。。。 C言語の特徴になるポインタってものが理解できていれば、その辺もわかりやすいと思うのですけどね。

purogu2017
質問者

お礼

回答有難うございます。

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.1

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

purogu2017
質問者

お礼

回答有難うございます。

関連するQ&A

  • C++でメモリの絶対番地を指定する方法はありますか。

    C++でメモリの絶対番地を指定する方法はありますか。 あるプログラムでメモリの指定した番地にデータを書き込み、別のプログラムで同じ番地のデータを読み込めるようにしたいと思ってます。プログラムは作ったのですが、絶対番地を指定していないようで、別のプログラム側で同じ番地を指定しても同じデータが読み込めません。

  • C言語におけるローカル変数が使用するメモリについて

    例のようなC言語のプログラムを動かした場合、 確保されるメモリ領域はどうなるのでしょうか。 例 #include <stdio.h> int main(void) { int a = 0; } このとき、変数aはint型なのでスタック領域に4バイトのメモリが確保されると理解しています。 と同時にaという変数名と確保されたスタック領域の番地を紐づけるようなメモリがどこかに確保されるのではないかと思ってるのですが、この理解で正しいでしょうか。 またその場合は変数aの番地はどの領域に確保されるのでしょうか。 ご教示お願いいたします。

  • C/C++言語のメモリについて

    C言語でメモリを2種類?に分けると、スタックとヒープがあります。 ヒープは mallocなどで確保し、freeで解放しますがスタックは解放する必要がありません。 そのスタックは通常、何バイトまで可能なのでしょうか? あと関数外のファイルの先頭に int[1000000];とした場合、このメモリはmallocで確保していませんが、 どこに作られるのでしょうか? 私のパソコンはメモリが2GBでWindows2000ですが、CやC++で最大、何バイトまでメモリが使えますか? また、一番多くメモリを確保できるなら、OSはなんでも構いません。 解釈等も間違っていたらご指摘していただきたいです。

  • C言語で200MBメモリをとるプログラムを書くには、どう書けばいいですか?

    タイトルのとおりなのですが、C言語で200MBメモリをとるプログラムを書くには、どう書けばいいですか? 一般的な例題として出題されています。 ご教授よろしくおねがいします。

  • C言語とC++言語

    C言語でコンパイルできC++でコンパイルできないプログラムとその逆でC++でコンパイルできC言語でコンパイルできないプログラムを教えてください。よろしく

  • C言語 mallocによる消費メモリ

    char *b = (char *)malloc(sizeof(char) * 6) というC言語のプログラムで、消費されるメモリは何バイトになるのでしょうか?理由も合わせて教えていただきたいです。 32ビットのPCで行うものとしてよろしくお願いいたします。

  • C言語 メモリ?

    最近、C言語の勉強を始めているものです。 gccでコンパイルし、実行ファイルを実行すると 強制終了 と表示されます。 gdbで実行してみると、 Program terminated with signal SIGKILL, Killed. The program no longer exists. You can't do that without a process to debug. と表示されました。 プログラムの中で、二次元配列 a[10000][10000],b[10000][10000] というような大きい配列を使っているのが原因なのかなと思っていますが、どうなんでしょうか?mallocでメモリを確保したらいいのでしょうか? ソースを載せることができなく申し訳ないですが、よろしくお願いします。

  • C言語でのプログラムの作り方

    はじめまして。C言語初心者の中学一年生です。 C言語でプログラムを作ろうと思ったのですが、やり方がわかりません。 ”hello”と表示するプログラムの作り方を教えてください。 使用しているコンパイラは"Visual C++ 2010"です。パソコンはWindows xpです。 中学生でも分かるように教えてください。 エディエタ、やソースプログラムなどの用語についても教えてくださると嬉しいです。

  • C言語をどうしたら?

    学校でC言語を習っています。 そして学校ではC言語を確かビュジアルネットというソフトにソースファイルなどを入れてプログラムを練習しているのですが、家でも練習したいのでどうしたらいいか教えてください。できましたらフリーソフトとその使い方を教えてくださるとうれしいです。 そして、いつかは他のパソコンでもそれが体験できるようにしたいので、その場合の方法も教えてください。

  • C言語 行列 配列

    現在、C言語を勉強中です。 C言語で (10000*10000)の大きさの行列を扱いたいです。 double a[10000][10000]の配列ではメモリ不足となってしまいます。 このような場合はどのようにプログラムを組んでいったら良いのでしょうか?

専門家に質問してみよう