未来のキャリアを変えるプログラミングスクール『TECH BOOST』AI、IoT、ブロックチェーンなど最新技術も学べる!

【C言語超入門(第34回)】変数の記憶方法の指定をしよう

Pocket

C言語超入門(第33回)において、C言語の変数は、局所変数(ローカル変数)と、広域変数(グローバル変数)に大分類できることをお伝えしました。

実はC言語の変数は、変数の記憶方法(変数データをコンピューターのメモリ上のどこに・どのように記憶するのか)を指定する「記憶クラス」という、もう一つの分類があります。

記憶クラスは、プログラマーが自由に指定することができます。

そこで今回のC言語超入門では、記憶クラスを使った、変数の記憶方法を指定する手続について、ご説明いたします。

C言語における記憶クラスの種類

C言語の記憶クラスは、大きく分類しますと、自動変数(auto)、外部変数(extern)、静的変数(static)の3つがあります。

・自動変数(auto) ・・・ 関数内だけで使用できる変数で、プログラム実行中に変数を格納するメモリ場所が変化する。
・ 外部変数(extern) ・・・ どの関数からも使用できる変数で、プログラム実行中は常に同じメモリ上に存在する。
・ 静的変数(static) ・・・ 関数内だけで使用できる変数で、プログラム実行中は常に同じメモリ上に存在する。

それでは各記憶クラスの説明を以下に整理いたします。

自動変数(auto)

自動変数のメモリ確保方法

自動変数は関数の内部で宣言を行い、その関数が呼び出されたタイミングで変数データがコンピューターのメモリ上に確保されます。

メモリ上に確保されたデータは、その関数が実行している間はずっと有効ですが、関数の処理が終了したタイミングで、自動的にメモリ上から削除されます。

このように自動変数は、変数を使うとき自動的にメモリ確保を行い、変数を使い終えたら自動的にメモリ解放を行います。

つまり、コンピューターのメモリを効率的に使うことができる、ということです。

変数のメモリ確保、解放を、すべて自動で処理することから「自動変数(auto)」と言います。

自動変数の適用範囲

自動変数の適用範囲は、変数を宣言した関数の中に限定されます。

宣言した関数以外からは、変数を参照することができません。

自動変数の使用方法

自動変数の宣言方法は次のとおりです。

自動変数はもっとも使用頻度の高い記憶クラスですから、「auto」の記述は省略してもよい、というルールになっています。

実際、多くのプログラマーは自動変数を宣言するときに「auto」の記述を行っていないようです。

外部変数(extern)

外部変数のメモリ確保の方法

自動変数は関数の外側で宣言を行い、プログラムが実行されたタイミングで、
変数データがコンピューターのメモリ上に確保されます。

自動変数と異なり、いったんメモリ上に確保されたデータは、そのプログラムが終了するまでメモリ上から削除されることはありません。

関数の外(外部)で変数を宣言することから、「外部変数(extern)」と言います。

外部変数の適用範囲

外部変数は、どの関数からでも参照することができます。

外部変数の使用方法

関数の外側で変数を宣言しますと、自動的に外部変数として処理されます。

外部変数は、どの関数からも参照できることにメリットがありますが、一方で、デメリットにもなります。

外部変数の値は、どの関数でも書き換えできてしまうため、
プログラムの規模が大きくなるにつれて、どこで変数の値が書き換わったのか、分かりにくくなります。

例えば、「ある関数内の変数を、プログラマーが自動変数だと思い込んで、変数の値を書き換えてしまった」というミスを、よく耳にします。

外部変数はどの関数からも参照できることから、
関数間でのデータ受け渡し方法として利用するケースがありますが、安全性の面から、安易に使用することは避けた方がよいでしょう。

静的変数(static)

静的変数のメモリ確保の方法

静的変数は、自動変数のように関数の中で宣言をして、その関数の中でのみ使用できます。

ですが関数の処理が終了しても、自動変数のようにメモリ上に確保された変数データは消滅しません。

外部変数のように、いったん確保された変数データは、メモリ上に確保され続けます。

つまり、自動変数と外部変数の持つ機能を組み合わせたのが、静的変数なのです。

自動変数が動的にメモリの確保・解放を行うのに対して、
いったん確保したメモリは動かさないことから「静的変数(static)」と言います。

静的変数の適用範囲

自動変数の適用範囲は、自動変数と同様に、変数を宣言した関数の中に限定され、宣言した関数以外から参照することはできません。

静的変数は変数のメモリを解放しないため、関数の処理が終了した後も、変数の値は保持されます。

つまり、関数が呼び出されたときは、前回の変数の値が記憶されている、ということです。

静的変数の使用方法

静的変数の宣言方法は次のとおりです。

自動変数の宣言では、「auto」の記述を省略することができましたが、静的変数の宣言では「static」の記述は省略することができませんので、気を付けてください。

もし「static」の記述を省略する(記述しない)と、自動変数として扱われます。

C言語超入門の第34回まとめ

さて今回のC言語超入門では、C言語の記憶クラスについて、ご説明いたしましたが、いかがでしたでしょうか。

最後にもう一度、記憶クラスについてポイントをまとめておきます。

・記憶クラスとは、変数の記憶方法を決定するもので、プログラマーが指定できる
・記憶クラスには、大きく分類すると、自動変数(auto)、外部変数(extern)、静的変数(static)の3つがある
・ 外部変数を使うと関数間のデータ受け渡しが簡単にできるが、プログラムの安全性が低下するため乱用は避けたい

ステップ・バイ・ステップ。焦らず一歩ずつ進んでいきましょう。

投稿者:プロスタ編集部

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

プログラミングで挫折しそうなら、現役エンジニアにマンツーマンで相談してみませんか?オンラインのプログラミングスクール「TechAcademy」のメンターが対応。

この記事が気に入ったら
いいね!しよう

プロスタの最新情報をお届けします

あわせて読みたい

関連記事

ページ上部へ戻る