はじめに
C言語を学び始めると、最初によく使うのが「変数」です。
例えば:
int x = 10;こうした変数の多くは、「ローカル変数」です。
しかし初心者のうちは、
初心者さんローカル変数とは何?グローバル変数との違いは?



関数が終わると消えるってどういうこと?



スコープって何?
と悩むこともあると思います。
この記事では、C言語のローカル変数について、
- 基本的な仕組み
- スコープ
- 生存期間
- static変数との違い
- 注意点
まで、初心者向けに分かりやすく解説します。
C言語文法解説シリーズ
本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説しています。
C言語文法解説シリーズ一覧はこちら


C言語の文法を基礎から体系的に解説するシリーズです。
- ローカル変数とは? ← 今回
- グローバル変数とは?
- static変数とは?
- 記憶域期間とは?
- スコープとは?
ローカル変数とは?
ローカル変数とは、「関数やブロックの中で宣言される変数」です。
例えば:
void func(void) {
int x = 10;
}この x がローカル変数です。
ローカル変数の特徴
ローカル変数には大きく3つの特徴があります。
- 関数内だけで使える
- 関数終了で消える
- 他の関数から見えない
関数内だけで使える
例えば:
#include <stdio.h>
void func(void) {
int x = 10;
printf("%d\n", x);
}これは問題ありません。
しかし:
#include <stdio.h>
void func(void) {
int x = 10;
}
int main(void) {
printf("%d\n", x);
}これはエラーになります。
関数についてはこちらの記事で解説しています。


なぜエラーになるの?
これは、x は func() の中だけで有効だからです。
つまりローカル変数には、「見える範囲(スコープ)」があります。
スコープとは?
スコープとは、「変数が使える範囲」です。
ローカル変数は、宣言したブロック内だけで使えます。
スコープについてはこちらの記事で解説しています。


ブロックとは?
ブロックとは { } で囲まれた範囲です。
例えば:
if (flag) {
int x = 10;
}この x は if 文の中だけで使えます。
if文についてはこちらの記事で解説しています。


ブロック外では使えない
if(flag) {
int x = 10;
}
printf("%d\n", x);これはエラーになります。
ローカル変数は関数終了で消える
ここも非常に重要です。
例えば:
void func(void) {
int x = 10;
printf("%d\n", x);
}関数が終わると、x は破棄されるため、値は保持されません。
このように変数には「いつ生成され、いつ消えるのか」
という概念があります。
これを、記憶域期間(Storage Duration)と呼びます。
ローカル変数を含む記憶域期間についてはこちらの記事で解説しています。


毎回作り直される
例えば:
#include <stdio.h>
void func(void) {
int count = 0;
count++;
printf("%d\n", count);
}
int main(void) {
func();
func();
func();
return 0;
}実行結果:
1
1
1
なぜ毎回1になる?
これは、「関数呼び出しごとにcount が新しく作られる」からです。
つまり:


が毎回起きています。
ローカル変数はどこに保存される?
通常、ローカル変数はスタック領域に保存されます。
例えば関数呼び出し時に、スタックに変数用メモリ確保が行われます。
関数終了時には、その領域が解放されます。
スタック領域についてはこちらの記事で解説しています。


通常のローカル変数とstaticローカル変数
通常のローカル変数と混同しやすいのが、staticローカル変数です。
例えば、関数内で次のように宣言した変数です。
static int count = 0;この変数は、見える範囲は通常のローカル変数と同じく宣言したブロック内です。
一方で、通常のローカル変数とは異なり、関数が終了しても値は保持されます。
つまり staticローカル変数は、
・スコープはブロック内
・生存期間はプログラム終了まで
という特徴を持ちます。
また通常のローカル変数が主にスタック領域に配置されるのに対し、staticローカル変数は一般的に .data領域 または .bss領域 に配置されます。
.data/.bss領域についてはこちらの記事で解説しています。


staticや公開範囲を制限する効果についてはこちらの記事で解説しています。


比較表
| 項目 | 通常ローカル変数 | staticローカル変数 |
|---|---|---|
| スコープ | 関数内 | 関数内 |
| 生存期間 | 関数実行中のみ | プログラム終了まで |
| 値保持 | されない | される |
| 主な領域 | スタック | data/bss |
static変数についてはこちらの記事で解説しています。


自動変数とは?
通常のローカル変数は、自動変数(automatic variable)
とも呼ばれます。
これは、「関数呼び出し時に自動生成され、
関数終了時に自動破棄される」ためです。
例えば:
void func(void) {
int x = 10;
}この x は自動変数です。
autoキーワードとの関係
C言語には:
auto int x;という書き方もあります。
ただし通常は省略されます。
つまり:
int x;と同じ意味です。
現在のC言語では、auto を明示的に書くことはほとんどありません。
修飾子autoについてはこちらの記事で解説しています。


ローカル変数の注意点
① 初期化されない場合がある
例えば:
int x;
printf("%d\n", x);ローカル変数は自動で0初期化されません。
そのため、不定値(ゴミ値)になる場合があります。
② 関数終了後は使えない
例えば:
int* func(void) {
int x = 10;
return &x;
}これは危険です。
なぜなら、x は関数終了時に消えるからです。
つまり存在しない変数のアドレスを返してしまっています。
これは初心者がかなりやりがちなミスです。
③ 同名変数に注意
例えば:
int x = 100;
void func(void) {
int x = 10;
printf("%d\n", x);
}この場合、関数内の x が優先されます。
これを「シャドーイング」と呼ぶことがあります。
ローカル変数のメリット
ローカル変数には、大きなメリットがあります。
C言語では基本的に、「必要な範囲だけで変数を使う」という考え方が重要です。
ローカル変数は、その考え方に最も適した変数です。
① 他の処理へ影響しにくい
ローカル変数は、関数内だけで使えるため、他の関数から勝手に変更されません。
例えば:
void func(void) {
int count = 0;
count++;
}この count は func() の中だけの変数です。
つまり:
- 他関数が変更できない
- 意図しない影響を受けない
- 状態を局所化できる
というメリットがあります。
グローバル変数だとどうなる?
例えば:
int g_count;を複数関数で共有すると、どこで値が変わったのか
追いにくくなる場合があります。
プログラム規模が大きくなるほど、
- 予期しない変更
- 状態依存
- デバッグ困難
が起きやすくなります。
グローバル変数とローカル変数の違いについてはこちらの記事で解説しています。


② コードを理解しやすい
ローカル変数は、「この関数だけのデータ」と分かりやすいです。
例えば:
void calc(void) {
int result;
int temp;
}を見ると、「この関数内で完結する処理なんだな」
と理解しやすくなります。
つまり、
- 影響範囲が狭い
- 読みやすい
- 修正しやすい
という利点があります。
③ バグを減らしやすい
変数の見える範囲が狭いほど、
問題発生箇所を特定しやすいです。
例えばローカル変数なら、「この関数内を見ればよい」となります。
しかしグローバル変数では、どこから変更されたか
追跡が難しくなる場合があります。
④ 関数を再利用しやすい
ローカル変数中心の関数は、外部状態に依存しにくいため、
再利用しやすくなります。
例えば:
int add(int a, int b) {
int result = a + b;
return result;
}この関数は、
- 外部変数を使わない
- 引数だけで動く
- 動作が分かりやすい
ため、安全に使いやすいです。
⑤ テストしやすい
ローカル変数中心の関数は、毎回同じ条件で動かしやすいです。
グローバル変数やstatic変数が多いと、前回状態が残るため、
テストが難しくなる場合があります。
「必要最小限のスコープ」が基本
C言語では、変数は必要最小限の範囲で使う
のが基本です。
つまり:
- まずローカル変数で考える
- 本当に必要なら共有する
- 必要最小限だけ公開する
という設計が重要になります。
これは組み込み開発でも非常に大切な考え方です。
まとめ
ローカル変数とは、「関数やブロック内だけで使える変数」です。
特徴を整理すると:
- スコープはブロック内
- 関数終了で消える
- 通常はスタック領域に配置
- 値は保持されない
となります。
C言語では、
- スコープ
- 生存期間
- メモリ領域
を分けて理解することが非常に重要です。
ローカル変数は、その基礎になる重要な概念です。
この記事が参考になった方へ
スコープを含むC言語の基本文法をこちらの記事で整理しています。


エンジニアとして技術を学ぶことは重要ですが、
キャリアや副業についても同時に考える必要があります。
副業の現実や市場価値、今後のキャリア戦略については、
こちらの記事でまとめています。


技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。





コメント