C言語の自動変数autoを完全ガイド!初心者でもわかる変数の寿命とスコープ
生徒
「先生、C言語のautoってよく聞きますけど、何に使うんですか?」
先生
「良いところに気がつきましたね。autoは、関数の中で宣言した変数が自動的に作られて、関数が終わると自動的に消えるという性質を持つキーワードです。」
生徒
「ということは、毎回新しく作り直されるってことですか?」
先生
「その通りです。関数を呼ぶたびに新しい箱が作られて、終わると消えます。これを“自動変数”と呼びます。」
1. C言語の自動変数(auto)とは?
C言語の自動変数とは、関数の中で宣言された変数のことです。これらは関数を呼び出すたびに新しく作られ、関数が終わると自動的に破棄されます。キーワードautoを付けても付けなくても結果は同じで、現在のC言語では省略するのが一般的です。
void sample(){
int x = 10; // autoを省略した自動変数
auto int y = 20; // 明示的にautoを指定
printf("%d %d\n", x, y);
}
2. スコープと寿命の違いを理解しよう
自動変数を学ぶ上で大切なのはスコープ(見える範囲)と寿命(生きている時間)の違いです。スコープは「どこからアクセスできるか」、寿命は「いつまで存在するか」です。自動変数は、宣言されたブロックの中でだけ有効で、ブロックを抜けるとメモリから消えます。
3. 自動変数の動きを体験してみよう
#include <stdio.h>
void counter_auto(void){
int count = 0;
count++;
printf("auto: %d\n", count);
}
int main(void){
counter_auto();
counter_auto();
counter_auto();
return 0;
}
実行結果:
auto: 1
auto: 1
auto: 1
このように、毎回新しい変数が作られて初期化されるため、値が持ち越されません。
4. static変数との違い
同じように関数の中で使う変数でも、staticを付けると関数をまたいでも値を保持できます。これはプログラム全体が終了するまで残る「静的変数」と呼ばれるもので、自動変数とは寿命が異なります。
#include <stdio.h>
void counter_static(void){
static int count = 0;
count++;
printf("static: %d\n", count);
}
int main(void){
counter_static();
counter_static();
counter_static();
return 0;
}
実行結果:
static: 1
static: 2
static: 3
このように、staticは一度作られると消えず、自動変数は毎回新しく作られるという大きな違いがあります。
5. グローバル変数との比較
プログラム全体からアクセスできる変数をグローバル変数と呼びます。自動変数は関数の中で完結するので、他の関数から書き換えられる心配がありません。逆に、グローバル変数は便利ですが、どこからでも触れてしまうため、バグの原因になりやすいです。基本的には必要な範囲を狭くする(スコープを限定する)のが良い習慣です。
6. メモリの仕組みとスタック領域
自動変数はスタック領域というメモリの一部に作られます。スタックは「後から入れたものを先に出す」構造で、関数を呼ぶたびに自動的に変数を積み上げ、関数が終わるとまとめて片付けます。この仕組みのおかげで高速に動作しますが、関数が終わった後にその変数を使おうとするとエラーになります。
7. よくある間違い:関数内の変数のアドレスを返す
char* wrong(void){
char buf[10]; // 自動変数(関数終了で破棄)
return buf; // 危険!消えた領域を返している
}
このようなコードを書くと、関数が終わった時点でbufが消えるため、呼び出し側では壊れたデータを参照してしまいます。関数の外にデータを渡したい場合は、呼び出し側で配列を定義して渡すか、mallocによる動的メモリ確保を使う必要があります。
8. autoを明示する必要はある?
現在のCコンパイラではautoを書かなくても同じ動きをします。つまり、次の二つの記述は等価です。
int a = 5;
auto int a = 5;
学習の最初のうちは理解のためにautoを付けてみるのも良いですが、実際の開発では省略するのが一般的です。