プログラミング+α学習ブログ

勉強したことの備忘録です。

自動記憶域期間と静的記憶域期間の変数の挙動を確認するプログラム

#include <stdio.h>

int fx = 0; // 静的記憶域期間 + ファイル有効範囲

void func(void)
{
    static int sx = 0;  // 静的記憶域期間 + ブロック有効範囲
    int ax = 0;         // 自動記憶域期間 + ブロック有効範囲
    
    printf("%3d%3d%3d\n", ax++, sx++, fx++);
}

int main(void)
{
    int i;
    
    puts(" ax sx fx");
    puts("---------");
    for (i = 0; i < 10; i++)
        func();
    puts("---------");
    
    return (0);
}

実行結果

 ax sx fx
---------
  0  0  0
  0  1  1
  0  2  2
  0  3  3
  0  4  4
  0  5  5
  0  6  6
  0  7  7
  0  8  8
  0  9  9
---------

静的記憶期間(static storage duration)

関数の中で"static"をつけて宣言されたオブジェクトや、関数の外で宣言・定義されたオブジェクトは、静的記憶期間をもつ。

オブジェクト生成のタイミング

プログラムの開始時、具体的にはmain関数を実行する前の準備段階

オブジェクト消去のタイミング

プログラム終了時。

オブジェクトの初期化のタイミング

オブジェクトの生成時。プログラムの流れが宣言を通過するたびに初期化することはない。

初期化子が与えられない場合

自動的に0で初期化される。

自動記憶域期間(automatic storage duration)

関数の中でstaticをつけずに定義されたオブジェクトは、自動記憶域期間をもつ。

オブジェクト生成のタイミング

プログラムの流れが、宣言を通過する時。

オブジェクト消去のタイミング

宣言を囲むブロックの終点すなわち" } "を通過する時、役目を終える。

初期化子が与えられない場合

初期値は不定値となる。