カテゴリ: C言語 更新日: 2026/01/05

C言語の自動変数autoを完全ガイド!初心者でもわかる変数の寿命とスコープ

C言語の自動変数(auto)の意味と実例
C言語の自動変数(auto)の意味と実例

先生と生徒の会話形式で理解しよう

生徒

「先生、C言語のautoってよく聞きますけど、何に使うんですか?」

先生

「良いところに気がつきましたね。autoは、関数の中で宣言した変数が自動的に作られて、関数が終わると自動的に消えるという性質を持つキーワードです。」

生徒

「ということは、毎回新しく作り直されるってことですか?」

先生

「その通りです。関数を呼ぶたびに新しい箱が作られて、終わると消えます。これを“自動変数”と呼びます。」

1. C言語の自動変数(auto)とは?

1. C言語の自動変数(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. スコープと寿命の違いを理解しよう

2. スコープと寿命の違いを理解しよう
2. スコープと寿命の違いを理解しよう

自動変数を学ぶ上で大切なのはスコープ(見える範囲)寿命(生きている時間)の違いです。スコープは「どこからアクセスできるか」、寿命は「いつまで存在するか」です。自動変数は、宣言されたブロックの中でだけ有効で、ブロックを抜けるとメモリから消えます。

3. 自動変数の動きを体験してみよう

3. 自動変数の動きを体験してみよう
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変数との違い

4. static変数との違い
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. グローバル変数との比較

5. グローバル変数との比較
5. グローバル変数との比較

プログラム全体からアクセスできる変数をグローバル変数と呼びます。自動変数は関数の中で完結するので、他の関数から書き換えられる心配がありません。逆に、グローバル変数は便利ですが、どこからでも触れてしまうため、バグの原因になりやすいです。基本的には必要な範囲を狭くする(スコープを限定する)のが良い習慣です。

6. メモリの仕組みとスタック領域

6. メモリの仕組みとスタック領域
6. メモリの仕組みとスタック領域

自動変数はスタック領域というメモリの一部に作られます。スタックは「後から入れたものを先に出す」構造で、関数を呼ぶたびに自動的に変数を積み上げ、関数が終わるとまとめて片付けます。この仕組みのおかげで高速に動作しますが、関数が終わった後にその変数を使おうとするとエラーになります。

7. よくある間違い:関数内の変数のアドレスを返す

7. よくある間違い:関数内の変数のアドレスを返す
7. よくある間違い:関数内の変数のアドレスを返す

char* wrong(void){
    char buf[10]; // 自動変数(関数終了で破棄)
    return buf;   // 危険!消えた領域を返している
}

このようなコードを書くと、関数が終わった時点でbufが消えるため、呼び出し側では壊れたデータを参照してしまいます。関数の外にデータを渡したい場合は、呼び出し側で配列を定義して渡すか、mallocによる動的メモリ確保を使う必要があります。

8. autoを明示する必要はある?

8. autoを明示する必要はある?
8. autoを明示する必要はある?

現在のCコンパイラではautoを書かなくても同じ動きをします。つまり、次の二つの記述は等価です。


int a = 5;
auto int a = 5;

学習の最初のうちは理解のためにautoを付けてみるのも良いですが、実際の開発では省略するのが一般的です。

カテゴリの一覧へ
新着記事
New1
C++
C++の変数のスコープと有効範囲を完全解説!初心者でもわかる基本と考え方
New2
C++
C++とは?歴史と特徴を初心者向けに解説!Rustとの違いとモダン言語比較
New3
C++
MinGWとMSYS2でWindowsにC++環境を構築する方法を徹底解説!初心者でもできるセットアップガイド
New4
Rust
Rust開発環境をLinuxで構築する方法とおすすめ設定を初心者向けに徹底解説
人気記事
No.1
Java&Spring記事人気No1
C言語
C言語をオンラインで実行できる便利なコンパイラサービスまとめ【初心者向け】
No.2
Java&Spring記事人気No2
C言語
C言語の関数定義と呼び出しを完全ガイド!初心者でも分かる基本の書き方
No.3
Java&Spring記事人気No3
C++
C++の主要な実装をわかりやすく解説!GCC・Clang・MSVCの違いと特徴
No.4
Java&Spring記事人気No4
C言語
C言語の列挙型(enum)の使い方を完全ガイド!初心者でもわかる基本操作
No.5
Java&Spring記事人気No5
C言語
Makefile入門:C言語プロジェクトを自動ビルドしよう!初心者でも分かる仕組みと使い方
No.6
Java&Spring記事人気No6
C言語
C言語の開発環境をWindowsに構築する方法【Visual Studio編】
No.7
Java&Spring記事人気No7
C言語
Visual Studio CodeでC言語を実行する方法【拡張機能の設定と実行手順】
No.8
Java&Spring記事人気No8
C++
MinGWとMSYS2でWindowsにC++環境を構築する方法を徹底解説!初心者でもできるセットアップガイド