第6章 C言語のポインタ ~ & と * を使ってみる ~

休憩室

 今まで、変数を宣言すると、箱が用意されると表現してきましたね。 しかし、そろそろ格好よく、「変数がメモリ(主記憶装置)上に確保される」と 言いなおしましょう。

 今回習ったアドレスを使うと、変数がメモリ上のどこに確保されているのかが、 よく分かります。変数は、決して宣言した順番には並んでいないのです。

 次の記述を打ち込んで見ましょう。また、このプログラムの中には、 外部変数、静的(static)変数、ユーザ定義関数、メモリの動的確保などの 極めて難しい文法が使われていますが、今のところ全く気にしないでください。 ここで重要なのは、表示される結果だけなのです。

— リスト17 —

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

/**
 * 関数プロトタイプ宣言
 */
void testFunction();

/**
 * 外部変数宣言
 */
int gaibuData;

void main()
{
      int localData;     /* 自動変数 */
  static int staticData;    /* 静的変数 */
      int *heapData;    /* ポインタ変数 */

  /**
   * ポインタ変数に対して、メモリを割り当てる
   */
  heapData = (int *) malloc( sizeof(int) );

  /**
   * 各変数のアドレスを出力する
   */
  printf(" gaibuData:%08X\n localData:%08X\n staticData:%08X\n heapData:%08X\n"
      " testFunction:%08X\n main:%08X\n printf:%08X\n", 
      &gaibuData, &localData, &staticData, heapData,
      testFunction, main, printf);

  testFunction();
}

/**
 * ユーザ定義関数
 */
void testFunction()
{
      int fLocalData;    /* 自動変数 */
  static int fStaticData;   /* 静的変数 */
      int *fHeapData;   /* ポインタ変数 */
  /**
   * ポインタ変数に対して、メモリを割り当てる
   */
  fHeapData = (int *) malloc( sizeof(int) );

  /**
   * 各変数のアドレスを出力する
   */
  printf(" gaibuData:%08X\n fLocalData:%08X\n fStaticData:%08X\n fHeapData:%08X\n", 
      &gaibuData, &fLocalData, &fStaticData, fHeapData);
}

 実行してみると、以下のように表示されたことかと思います。
 (アドレスは環境によって変わってきます)

  gaibuData:00415154
  localData:0012FF7C
  staticData:00414D30
  heapData:00420A10
  testFunction:00401005
  main:0040100A
  printf:004010C0
  gaibuData:00415154
  fLocalData:0012FF68
  fStaticData:00414D34
  fHeapData:00420A40 

 local(Local)が付く変数は、0012・・・・番台になっていますね。
 同様に、heap が付く変数は、0042・・・・番台になっています。
 gaibu と static(Static)が付く変数は、0041・・・・番台。
 関数 tesuFunction や main 、printf は、0040・・・・番台。

 これは、次のように分類されます。

 変数は、このようにメモリ上に配置されていたのです。

 ここで気を付けて欲しいのは、常に0012・・・・や0042・・・・という値であると決まっているわけではありません。 OSによっても、コンパイラによっても、値が変わってきます。

 このようなメモリのイメージは、今のところ、気にする必要はありませんが、 知っておいて決して損はありません。

 バグ(プログラムの不具合)の原因がどうしてもわからない時は、 変数のアドレスを表示させてみるとわかる時があります。 そのために、バグを解析するツールであるデバッガーというものには、 実行中のプログラムのメモリイメージを表示してくれる、便利な機能が付いていたりします。

< 前のページへ

Pagetop