第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によっても、コンパイラによっても、値が変わってきます。
このようなメモリのイメージは、今のところ、気にする必要はありませんが、 知っておいて決して損はありません。
バグ(プログラムの不具合)の原因がどうしてもわからない時は、 変数のアドレスを表示させてみるとわかる時があります。 そのために、バグを解析するツールであるデバッガーというものには、 実行中のプログラムのメモリイメージを表示してくれる、便利な機能が付いていたりします。
< 前のページへ 次のページへ >-
IS 559680 / ISO27001
認証範囲 本社、芝大門オフィス情報セキュリティ基本方針 -
個人情報保護方針
個人情報の取扱いについて
保有個人データ又は
第三者提供記録に関する
事項の周知について
特定個人情報の取扱いについて -
FS 671851 / ISO9001
認証範囲 本社、芝大門オフィス品質方針