※本記事は広告を含みます。
メモリ領域解説シリーズ
本記事は「メモリ領域解説」シリーズの1つです。
初心者さん先輩、static変数って普通の変数と何が違うんですか?



一番大きな違いは 寿命(ライフタイム) なんだ。



寿命?



普通のローカル変数は 関数が終わると消える。
でも static変数は プログラム終了まで存在し続けるんだ。



え、じゃあグローバル変数みたいですね?



そう。実は メモリ配置もグローバル変数と同じ領域 に置かれるんだ。



スタックじゃないんですか?



そう。static変数は stackではなく data領域やbss領域 に配置されるんだ。
static変数とは?
C言語の static変数 とは、
プログラムの実行中ずっと値を保持する変数 のことです。
通常のローカル変数は関数を抜けると消えてしまいますが、
static変数は 関数が終わっても値が保持され続けます。
#include <stdio.h>
void counter()
{
static int count = 0;
count++;
printf("%d\n", count);
}int main()
{
counter();
counter();
counter();
}実行結果
1
2
3通常のローカル変数なら毎回 1 になりますが、
static変数は 値が保持される ため増え続けます。
staticの文法的な使い方はこちらの記事で解説しています。
static変数のメモリ配置
C言語のプログラムでは、メモリは次のように分かれています。
| 領域 | 用途 |
|---|---|
| text | プログラムコード |
| data | 初期値ありグローバル変数 |
| bss | 初期値なしグローバル変数 |
| heap | 動的メモリ(malloc) |
| stack | 関数呼び出し・ローカル変数 |
- C言語のメモリ領域を徹底解説
- data領域とbss領域の違い
- スタック領域とは?
static変数は stackではなく静的領域に配置 されます。
| 変数 | 配置 |
|---|---|
| static int a = 1 | data領域 |
| static int a | bss領域 |
初期値による違い
static変数は 初期値の有無によって配置が変わります。
初期値あり
static int a = 10;→ data領域
初期値なし
static int a;→ bss領域
bss領域は 自動的に0初期化 されます。
ローカルstatic変数
staticは 関数内でも使用できます。
void func()
{
static int count = 0;
}特徴
| 項目 | 説明 |
|---|---|
| スコープ | 関数内 |
| 寿命 | プログラム終了まで |
| 配置 | data/bss |
つまり
スコープ = ローカル
寿命 = グローバル
という少し特殊な変数です。
この考え方については、別の記事で詳しく解説しています。
👉 C言語でグローバル変数を避ける理由とは?staticを使った設計の基本
グローバル変数との違い



じゃあstaticってグローバル変数と同じですか?



メモリ配置は同じだけど、スコープが違うんだ。
| 変数 | スコープ |
|---|---|
| グローバル変数 | 全ファイル |
| staticグローバル | そのファイルのみ |
例
static int counter;この変数は 同じファイルからしかアクセスできません。
これは 内部リンク(internal linkage) と呼ばれます。
実務での使い方
組み込み開発では、static変数はよく使われます。
例
状態保持
static int state;カウンタ
static int retry_count;モジュール内部データ
static uint8_t buffer[256];外部からアクセスさせないデータ を作るときに便利です。
まとめ
static変数のポイントをまとめます。
- static変数は 値を保持し続ける変数
- stackではなく data / bss領域 に配置される
- 関数内でも使用できる
- staticグローバルは ファイル内だけで有効
- 組み込み開発では状態保持などに使われる
staticはシンプルなキーワードですが、
メモリ構造を理解するうえで非常に重要な概念です。
この記事が参考になった方へ
メモリ領域については他の記事でも解説しています。
技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。









コメント