2 実行時のメモリーの配置

プログラムを実行するとき,命令やデータはメモリーにどのように配置されるのだろうか? ふたつの例をとおして考える.

2.1 簡単なの例

ひとつの変数--データ領域--をもつ単純なプログラムで,命令とデータのメモリーの配 置を調べる.リスト1の例でmain関数と変数hogeの先頭アドレスを調べる. このプログラムを実行した結果より,アドレスは図1のようになっ ていることが分かる.すなわち,次の通りである. -4pt これはたまたまではなく,大体いつもこのように配置される.プログラムはメモリーの前半,ロー カル変数のデータはメモリーの後半に格納される.
   1 #include <stdio.h>
   2 
   3 int main(void)
   4 {
   5   int hoge;
   6 
   7   hoge=0x1234abcd;
   8   printf("Hello world!\n");
   9  
  10   printf("adress main:%p\n", main);
  11   printf("adress hoge:%p\n", &hoge);
  12 
  13   return 0;
  14 }


\fbox{実行結果}
Hello world!
adress main:0x80483b4
adress hoge:0xbfacb7d0

図 1: リスト1の場合のメモリーの様子.
\includegraphics[keepaspectratio, scale=0.7]{figure/memory_hello_c.eps}

2.2 複雑な例

もう少し複雑な場合,文字定数や静的変数やユーザー定義関数のアドレスなデータではど うなるであろうか? リスト2を実行させ,それぞれのアドレスを調べる. このプログラムを実行した結果より,アドレスは図1のようになっ ていることが分かる.すなわち,次の通りである. -4pt これもたまたまではなく,大体いつもこのように配置される.プログラムや文字列定数静 的変数はメモリーの前半,ローカル変数のデータはメモリーの後半に格納される.ここで は示さなかったが,グローバル変数もメモリーの前半に格納される.要するにローカル変 数のみメモリーの後半に格納されるのである.

なぜ,ローカル変数のみ特別なのであろうか? ローカル変数は関数が呼び出されたときの みメモリーが割り当てられる.関数が呼ばれていないときにはメモリーが割り当てられて いないのである.このようにすることにより,必要な時のみメモリーを割り当てることあ でき,効率的にメモリーを使うことができる.また,再帰関数が可能となる.必要な時に メモリーを割り当てることにより,再帰呼び出しを行っても,追加でメモリーの確保がで きる.

中間試験の後に学習することになるが,ローカル変数のメモリー割り当てにはスタックと 呼ばれる仕組みが使われている.このようなことから,ローカル変数の領域をスタッ ク領域と呼ばれる.また,プログラムの関数が格納される領域をコード領域,グ ローバル変数や文字列定数が格納される領域をデータ領域と言う.本日の講義の後 半で述べるmalloc()により確保されるメモリー領域をヒープ領域と言う.

   1 #include <stdio.h>
   2 
   3 void prt(char *c);
   4 int main(void)
   5 {
   6   static int si=9999;
   7   int i=8888;
   8   
   9   printf("main\t%p\t\n", main);
  10   printf("prt\t%p\t\n", prt);
  11   printf("%d\t%p\n", si, &si);
  12   printf("%d\t%p\n", i, &i);
  13   prt("HELLO");
  14 
  15   return 0;
  16 }
  17 
  18 void prt(char *c)
  19 {
  20 
  21   printf("%s\t%p\n",c,c);
  22 }


\fbox{実行結果}
main    0x8048384
prt     0x8048415
9999    0x8049620
8888    0xbff44440
HELLO   0x804850e

図 2: リスト2の場合のメモリーの様子.
\includegraphics[keepaspectratio, scale=0.7]{figure/memory_value_c.eps}



ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成19年6月5日


no counter