第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・・・・ |
スタック領域
|
| 0040・・・・ |
プログラム領域 |
| 0041・・・・ |
静的領域 |
| 0042・・・・ |
ヒープ領域 |
変数は、このようにメモリ上に配置されていたのです。
ここで気を付けて欲しいのは、常に0012・・・・や0042・・・・という値であると決まっているわけではありません。 OSによっても、コンパイラによっても、値が変わってきます。
このようなメモリのイメージは、今のところ、気にする必要はありませんが、 知っておいて決して損はありません。
バグ(プログラムの不具合)の原因がどうしてもわからない時は、 変数のアドレスを表示させてみるとわかる時があります。 そのために、バグを解析するツールであるデバッガーというものには、 実行中のプログラムのメモリイメージを表示してくれる、便利な機能が付いていたりします。