• ベストアンサー

動的確保について

こんばんは。プログラミングについてお聞きしたい事があり 投稿させて頂きました。初心者なので見当違いでしたら申し訳 ありません。 現在、C言語でプログラムを作成しているのですが、メモリの 動的確保をする際、確保する領域の先頭アドレスを指定するという ことは出来ないのでしょうか。 現在はmallocを使用して領域を確保していますが、実験の都合上、 どうしても自分で確保すべき領域を指定したくなりました。 調べても分からないのでもしノウハウをお持ちの方がいましたら 教えて頂けますでしょうか。 宜しくお願い致します。

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

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

 どうも、動的確保という理念から外れているような気がします。  ちょっと機械語とかアセンブラとか言われるレベルまで話を落としますね。これは、CPUの命令語そのもので、総てのプログラムは最終的に、この言語に翻訳されてから実行されます。  この世界でプログラムを組む時には、メモリーイメージの計画を作ることから作業を始めます。プログラムは、メモリー番地***~***までに格納し、このデータは、***~***に納め・・・というのを全部自分で決めるわけです。  OSが存在する場合は、OSによって定められた規則がありますから、その規則に従うようにメモリーイメージを計画する必要があります。  (参考までに)最近のCPUやOSでは、物理メモリーアドレスはOSの専権事項で一般のプログラムでは制御することが出来ませんが、その場合は、論理アドレスを操作することになります。  さて、あるアドレスを***のデータ専用と言うように割り振っていくと、一度しか使わないデータにも専用のアドレスを割り当てることになりもったいないですね。メモリーは有限な資源ですから有効に活用したいものです。****と++++のデータは同時に使うことはあり得ないと知っていますから、これは同じメモリーを使うようにしましょう。と言ったことを全部、紙と鉛筆で管理していると、とっても大変です。  そこで、メモリーヒープと考え方を導入します。あるメモリーブロックをメモリーヒープとして予約します。そして、このヒープ内のアドレスが、今現在使用されているかどうかを管理し、必要に応じて、アドレス領域を割り当て、不要になったら不使用と記録するプログラムを作成し、ヒープ内のメモリーを使用する時には、このプログラムを通してだけアクセスすることにします。これで、紙と鉛筆で再利用の管理をする必要がなくなりました。  この管理プログラムをC言語で実装したものがmallocとfreeなんです。  アドレスを自分で指定するなら・・・・アドレスマップを自分で完全に制御したいなら、そもそもメモリーヒープの概念そのものが不要なんですよ。  では、C言語でアドレスを直接指定する時には、どうするか?生のポインターを直接コントロールします。ポインター=メモリーアドレスですから、ポインターに直接アドレスを代入して、そのまま使用すればOKです。もちろん、OSの管理規約に合わせるのも、他の必要なデータが入っているアドレスを踏みつぶさないようにすることも全部自己責任ですよ。また、OSによっては(いや最近のパソコンレベル以上なら必ず)、メモリーを使用する際には、OSのAPIを使用して、メモリーの使用領域を宣言する必要がありますから、その時には、ちゃんと規約に従って宣言する必要があります。でないと、アクセスしたとたん、OSから、そのメモリーは使用されてはいけない部分だとおしかりを受けることになります。  ただし、ポインターに、メモリーアドレスを格納する方法に関しては、C言語の仕様では何も定義されていません。完全な実装依存です。従って、コンパイラーの実装と、CPU(必要ならOSも)の仕様を調べて、どのような形でメモリーアドレスがポインターに格納されているかを調べておく必要があります。それが解れば、必要な数値をキャストを使ってポインターに代入するだけで、自分の希望するアドレスの領域の確保は完了です。  普通、マルチタスクが出来る環境(今時のパソコンなら漏れなくそうです。)では、メモリーアドレスは自分で制御できないのが原則ですので、このようなことは「しない」か、「出来ない」のが普通です。(OSに絶対アドレスを指定してメモリーの使用を宣言するためのAPIそのものが存在しない。または、使用が推奨されない低レベルAPIである。のいずれかです。)  機械制御用のCPU(いわゆるマイコン)のレベルですと、このようなことをすることは、実際にもありますし、必要な事も多いです。

namake25
質問者

お礼

詳細なご説明ありがとうございます。 すっきりしました。

その他の回答 (3)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

メモリの連続性が欲しいのでしょうか? それとも仮想空間か物理アドレス指定で確保したいのでしょうか? アドレス指定の意図を教えてください。 それと動作させる予定のOSと使用してるコンパイラを教えてください。

namake25
質問者

お礼

どうもありがとうございます。

noname#221368
noname#221368
回答No.2

 Windowsの場合ですが、WindowsAPIを使用すれば可能かも知れません(調べてません)。ふつうのプログラマーが出来るのは、その辺りが限度です。まさかとは思いますが、もしDOSをご使用でしたら、WindowsAPIに相当するのは、DOS-Function-Callです。  やはり#1さんの仰るように、理由と使用環境を補足するのが無難と思います。

namake25
質問者

お礼

どうもありがとうございます。

  • Lchan0211
  • ベストアンサー率64% (239/371)
回答No.1

普通はできません。 なぜ自分でアドレスを指定したいのかと どんな環境(OS等)で実行するプログラムかを補足すると、 よいアドバイスが得られるかもしれません。

namake25
質問者

お礼

どうもありがとうございます。

関連するQ&A