http://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/node8.html
ここにテキストの領域というのがありますが、ここのアドレスを表示したいです。
cで表示するにはどうすればよいでしょうか?
あと、領域がいくつもあると思いますが、どういう風に使い分けていて、どんな時にどの領域が使われるのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
C言語は、ある意味何でもできるので、やろうと思えばできなくはないです。(詳しく確かめた訳ではないので、処理系によっては禁止されているかもしれませんけれども。)
が、しかし、テキスト領域 はプログラムが格納される領域なので、不用意にアクセスしてデータ(=プログラム)を壊すと暴走しサーバーの再起動を余儀なくされてしまうので、通常は行いませんし、行う必要もありません。
(テキスト領域にアクセスする必要があるのは、おそらく、組み込み系の一部のプログラムか、コンピューターウィルスくらいだと思います。)
アクセスの必要性とリスクを理解している方ならば、アクセス方法も当然ご存知のはず(特別な方法は不要)なので、敢えて説明はしません。
領域がいくつもあると思いますが、どういう風に使い分けていて、どんな時にどの領域が使われるのでしょうか?
という点についてですが、その役割についても sumsum25さんがご参照のページに既に説明されています。
- テキスト領域:機械語に翻訳されたプログラムが格納される. この機械語の命令が 1 行づつ実行されることでプログラムが動く。
- 静的領域:グローバル変数などの静的変数が置かれる。
- ヒープ領域:メモリの動的管理 (C 言語の malloc 関数や C++ の new 演算子でメモリを確保すること) で用いられる。
- スタック領域:今回の演習で扱ったように CPU のレジスタを一時的に退避させたり、また C 言語の自動変数 (多くのローカル変数) が置かれる。
1) の テキスト領域 はプログラムが格納される場所なので、プログラムがコンパイル/リンクされた時点で自動的に確保されるもので、プログラマーが利用できる領域ではありません。
2) の 静的領域 は「静的変数」つまりコンパイル時点で変数の型や数が確定し、プログラムの実行中ずっと変更のない(=静的)なものが割り当てられる領域で、コンパイル/リンクの時点で処理系によって割り当てられるので、プログラマーが利用できる領域ではありません。
3) の ヒープ領域 は、プログラム実行中に必要に応じて割り当てられる(プログラマが確保する)領域です。具体的には「C 言語の malloc 関数」や「 C++ の new 演算子」で割り当てられるので、使用後にはプログラマーの責任で「解放」してやらないといけない領域です。
4) の スタック領域 は、関数の呼び出しやローカル変数の使用によって、処理系(コンパイラー/リンカー)が自動的に割り当てる領域なので、プログラマーが直接利用できる領域ではありません。
もし詳しくお知りになりたいのであれば、プログラマーが書いたソースプログラムをコンパイラーやリンカーといったツールによってどのように実行形式のファイルに変換し、それがコンピューターのメモリー上にどのようにロードされて実行されるのかについて、大まかでも良いので調べてみられると良いです。
投稿2015/09/22 14:34
総合スコア5936
0
中途半端に、
http://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/node8.html
だけを問題にしているようですが、???
’
マイクロプロセッサおよび演習 (最終稿)
http://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/
から、順に読んで、行ってみて理解出来なければ、
学校の演習程度でも、能力不測と云う事で、諦めも付くかもでしょうが、
前提となっているのが、
2001~2004年の講義のまとめです。
前提が古すぎなような気がします。
’
【抜粋】
「本ページでは私 (金丸) が 2001 ~ 2004 年度に東京農工大学にて行った
「マイクロプロセッサおよび演習」の演習分に関する資料を公開しています。」
【抜粋了】
の様子ですから、場合により読み替えたり、
質問者さんが使用している環境に合わせて、再構築したり、改変したりする能力も
要求されます。
投稿2015/09/22 18:15
編集2015/09/22 18:21総合スコア2028
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
領域がどこからどこまでかというのは環境に依存するのでC言語だけでは無理ですが、だいたいどの辺かなら表示できます。その領域にある値ごとにアドレスを表示してみればいいのです。
#include <stdio.h> #include <stdlib.h> static const int rodata = 0x12345678; static int data = 0x12345678; static const int bss; void text() { } int main(void) { int stack; int *heap; heap = malloc(sizeof(*heap)); printf("text: %p\n", text); printf("rodata: %p\n", &rodata); printf("data: %p\n", &data); printf("bss: %p\n", &bss); printf("stack: %p\n", &stack); printf("heap: %p\n", heap); free(heap); return 0; } /* Linux(64bit)上での出力例 text: 0x400596 rodata: 0x4006d4 data: 0x600ab0 bss: 0x600ab8 stack: 0x7ffd12470274 heap: 0x1fa9010 */
ここでrodata, data, bssはいずれも静的領域に入ります。textとrodataは組み込みでRAMに展開せずにROMから直接読みや実行ができる場合があるのでだいたい並んでます。dataとbssも似てるので並んでますね。そしてstackがずいぶん高いとこにありますね。
アドレスを見ると、ちゃんと「テキスト領域<静的領域<ヒープ領域<スタック領域」 になってますね。ただし結果は環境に依存しますので、質問者さんの環境ではどうなっているか試してみてください。
投稿2015/09/22 15:57
総合スコア1149
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。