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

4.5 静的記憶領域 (3)


では、変数の初期化について調べてみましょう。

サンプルプログラム

   1: /*  initval.c  --  初期化  */
   2: 
   3: #include        
   4: 
   5:         int     glob = 100;
   6: static  int     stat = 200;
   7: 
   8: void    statictest( void )
   9: {
  10:         static  int     s = 0;
  11:                 int     v = 0;
  12: 
  13:         ++v;
  14:         ++s;
  15:         printf( "s=%d  v=%d\n", s, v );
  16: }
  17: 
  18: void accident( void )
  19: {
  20:         int     w;
  21: 
  22:         w = 12345678;
  23: }
  24: 
  25: main()
  26: {
  27:         printf( "glob=%d  stat=%d\n\n", glob, stat );
  28: 
  29:         statictest();
  30:         statictest();
  31:         statictest();
  32:         accident(); 
  33:         statictest();
  34:         statictest();
  35:         statictest();
  36: }

変数の宣言と同時に初期値が指定されているものに、関数の外部にある変数

   5:         int     glob = 100;
   6: static  int     stat = 200;
  

があります。これらの変数は、Cのプログラムで最初に実行される関数 main の起動時には、すでに値が設定されています。したがって、プログラム起動時 に1回実行されるか、あるいはそれ以前のコンパイル時に決定されたかのいず れかです。関数の外側にある変数なので静的記憶領域に配置され、どの関数が 実行を終えようと、存在し続けます。

次に、関数statictest内部の変数として

  10:         static  int     s = 0;
  11:                 int     v = 0;
  

があります。いずれも0に初期化しています。関数内部では、呼び出しごとに 両変数をインクリメント(+1)しています。しかし、実行すると、結果は次のよ うになりました。

実行結果

glob=100  stat=200

s=1  v=1
s=2  v=1
s=3  v=1
s=4  v=1
s=5  v=1
s=6  v=1

staticのついたローカル変数は毎回1ずつ増加していますが、staticのない 方はいつも1です。前回は関数accidentが呼ばれると、単なるローカル変数 (auto変数)は、突然とんでもない数値になりました。今度はそういうことは ありませんが、常に1になっています。

staticがついた静的記憶領域にある変数は、関数statictestの起動の前に初 期値が与えられます。関数の内部にあるが、関数の呼び出しごとに初期値の設 定が行なわれるのではありません。

一方、関数内部の単なる変数は、関数が呼び出されるごとに変数のための領 域がメモリ上に確保されます。初期値があった時には、その変数の領域に初期 値がセットされます。したがって、関数を呼び出すごとに初期化は繰り返され ます。関数accidentを呼んだ後ではauto変数 v の値はとんでもない値が入っ ていたはずですが、呼び出しごとに0に初期化され、関数accidentの影響が消 されたのです。


staticには、もう1つ重要な使命があります。「外部的にstaticな変数」は、 他のソースファイルからは参照できないことです。これは、extern宣言と対極 をなし、何も宣言しなければグローバル変数になるC言語の「情報開けっ広げ 主義」にフタをし、プログラムの安全性を高める「情報隠蔽(いんぺい)」を 実現します。これについては、「4.9 extern」でstaticとexternを対照し ながら説明します。

⇒⇒⇒⇒4.6 const修飾子


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