C言語入門(26) 変数のスコープ(使用可能な範囲)はどこまで?

Posted: 2013年02月07日

今回は変数の存在範囲(スコープ)について説明をします。
変数は、指定された範囲でのみ使用ができその範囲外ではその変数を使用することはできません

具体的には、関数内で宣言されている変数は、他の関数から使用することはできません。
※関数から呼び出された関数内では元の関数の変数は使用することは不可能ではありません。

変数では、領域確保とアクセス可能スコープが存在します。

領域確保のスコープ

変数には、2種類の領域確保のスコープの設定をすることが可能です。
それは、自動変数と静的変数です。
自動変数は、通常の変数です。

int nNumber;

静的変数は、staticを負荷した宣言を記述した変数です。

static int nNumber;

自動変数では、変数が定義されている箇所のスコープ外に移動する際に領域が解放されます。
具体的には、関数内で宣言した場合関数の処理が終了した場合、変数は解放されます。

静的変数では、実行プロセスが終了するまで解放されません。
自動変数と比較すると静的変数は、関数内で定義を行なっても解放されることはなく
関数内でその変数を使用することができます。
解放されない利点は、前回の関数で実行された結果を格納することができます。
 キャッシュに用いることも可能です。
 strtokでは、この手法を使用しています。

なぜ、このような違いがあるのか

自動変数は、メモリーのスタック領域に確保されるため
関数が終了すると開放する必要がでます。

静的変数は、メモリーの静的領域に確保されるため
スタック領域が変化しても(処理が行われても)解放されることはありません

アクセス可能のスコープ

アクセス可能な範囲は、基本的には{}で囲まれた領域内です。

void func() {
  int a;
  while (true) {
    int b;

    {
      int c;
    }

  }
 }

変数a,b,cはそれぞれ{}ないでしかアクセスが可能ではありません
これらの変数が自動変数の場合は、アクセス可能ではなくなった場合に解放される場合があります。

また、C言語の場合は、
関数の先頭に宣言をまとめる必要がある場合があるため
その場合はこのような記述はもちろん出来ませんが
スコープに関しては同様のはず!!

.h(ヘッダーファイル)で宣言した場合は、全てのソースからアクセスが可能です。
もちろんincludeする必要はあります。
これをグローバル変数と呼びます。
このグローバル変数でよく使用するものは
#include <errno.h>のerrno変数です。
この変数は、エラー番号を返却することに使用します。
私達が使用してもいいですが使用しなくてもいいため
標準関数以外は、エラー番号が設定されていることをあまり期待しないほうがいいでしょう

カテゴリー: プログラム, 入門 | タグ: , | コメント無し »

コメント