『Cプログラミング専門課程』目次第4章メモリ

4.1 アドレス (2)


メモリは非常に具体的な、手に取って見えるものです。変数の先頭に&をつ ければ変数のアドレスになります。それを利用し、変数や関数がメモリ上でど のように割り当てられているか、簡単なプログラムで実験してみましょう。

サンプルプログラム

   1: /*  memaddr.c -- アドレス  */
   2: 
   3: #include        <stdio.h>
   4: #include        <stdlib.h>
   5: 
   6:         int     glob;
   7: static  int     stat;
   8: 
   9: func( int p )
  10: {
  11:         static  int     s;
  12:                 int     loc;
  13: 
  14:         printf( "parameter addr   : %p\n", &p );
  15:         printf( "func static addr : %p\n", &s );
  16:         printf( "func local  addr : %p\n", &loc );
  17: }
  18: 
  19: main()
  20: {
  21:         char*   alc = malloc( 1000 );
  22: 
  23:         func( 100 );
  24: 
  25:         printf( "allocated addr   : %p\n", alc );
  26:         printf( "global var addr  : %p\n", &glob );
  27:         printf( "static var addr  : %p\n", &stat );
  28:         printf( "func() addr      : %p\n", func );
  29:         printf( "main() addr      : %p\n", main );
  30:         printf( "addr of printf   : %p\n", printf );
  31: }

実行結果

parameter addr   : f7fffaa4
func static addr : 40e8
func local  addr : f7fffa54
allocated addr   : 6120
global var addr  : 40d0
static var addr  : 40f0
func() addr      : 22d8
main() addr      : 23b8
addr of printf   : 4090




実行すると変数、関数のアドレスが表示されます。

アドレスの順番に並べ替えると、同種のものが集まっているのが分ります。 メモリは、その利用のされ方により、関数領域(プログラム領域)、静的記憶 領域、動的記憶領域(ヒープ領域)、スタックの4領域に分けられます。

アドレスは16進数8桁で示されており、32ビットアドレスです。上位桁が0 の場合は省略されています。コンピュータによっては16ビットアドレスの場合 もあるでしょう。あるいは、16ビットアドレスと32ビットアドレスを混ぜて使 用している場合もあります。

4つの領域の並び方は、コンピュータ、コンパイラにより異なります。 自分のコンピュータで、変数などがどのようなアドレスに配置されるかを表 示するプログラムを作って確認してください。デバッガで確認してもかまいま せん。いずれにしても、本なんかに載っている図だけを見ながら読み進むので はなく、実験、実証しながら1つ1つ体得してください。

常にメモリマップを描いて、実際のメモリと変数などがどう関係するかを自 ら調べられるようになれば、C言語は理解できたようなものです。

*常識*
  • メモリマップを描く。
  • アドレスこそメモリ理解の要。

⇒⇒⇒⇒次ページへ


Copyright1996 Hirofumi Fujiwara. No reproduction or republication without written permission
『Cプログラミング専門課程』目次第4章メモリ