ログイン
kid's world

決してやってはならないこと

決してやってはならないこと

間接演算子を使うと,メモリに直接アクセスできるようになる。しかし使い方を少し誤ると,非常に危険なプログラムになってしまう恐れがある。まずList 4を見ていただきたい。これは,ポインタ変数pのアドレスと,その内容(これもアドレス)を表示する例である。

List 4: 初期化していないポインタ変数

#include <stdio.h>

main()
{
  int *p;
  
  printf("pのアドレスは%p\n",&p);
  printf("pの内容は%p\n",p);
}

以前に述べたように,変数は初期化しなければならない。初期化しなければ,どのような値が入っているかは保証できない。それはポインタ変数でも同じことである。実行結果をFig. 5に示そう。

Fig. 5: List 4の実行結果

pのアドレスは0F58
pの内容は0133

この実行結果の意味するところをイメージで書くと,Fig. 6のようになることは,もうわかってきただろう。

Fig. 6: ポインタ変数pのアドレスと中身

/c/pointer-fig6.png

ここまではいい。この先,間接演算子を使ったらたいへんなことが起こるのだ。たとえば,List 4の最後に,次の1文を書いたとする。

*p=100;

すると,0133という,どこだかわからないアドレスのメモリに対して,100の数値を書き込んでしまうことになるのだ。メモリ上にはデータだけではなく,プログラムも記憶されている。もし0133のアドレスが,プログラムのために使われていたとしたら? その先に起こることは,もうとうてい予測不能である。OSが優秀であれば,List 4のプログラムが不正な行為をしたとして強制的に落とされるが,そうでない場合,コンピュータ全体がフリーズしてどうにもならなくなることがほとんどである。

ポインタ変数を扱う場合,普通の変数を扱うときよりもさらに「初期化しなければならない!」ということに注意してほしい。ポインタ変数を初期化するということはすなわち,安全なメモリ領域を指すようにするということである。たとえばint型変数iが宣言されていれば,すぐさま,

p=&i;

として,ポインタ変数pが変数iのアドレスを指し示すようにするのだ。


メモリ領域の確保と開放」へ進む

広告


©Toshio Koide 1996-2007.

目次

リンクについて

リンクは御自由にどうぞ。

メール

mail.gif

広告