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変数って普通の変数と何が違うんですか?



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



寿命?



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



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



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



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



そう。static変数は stackではなく data領域やbss領域 に配置されるんだ。
メモリ領域解説シリーズ
本記事は「メモリ領域解説」シリーズの1つです。
メモリ領域解説シリーズの全体像はこちら


static変数のメモリ配置
C言語のプログラムでは、メモリは次のように分かれています。


メモリ領域の全体像の詳細はこちらの記事で解説しています。


static変数は stackではなく静的領域(data領域、bss領域)に配置 されます。
初期値の有無によって、data領域またはbss領域に配置されます。
| 変数 | 配置 |
|---|---|
| static int a = 1 | data領域 |
| static int a | bss領域 |
data領域とbss領域についてはこちらの記事で解説しています。


初期値によるメモリ配置の違い
static変数は 初期値の有無によって配置が変わります。
初期値あり
static int a = 10;→ data領域
初期値なし
static int a;→ bss領域
bss領域は スタートアップコードで自動的に0初期化 されます。
スタートアップコードについてはこちらの記事で解説しています。


ローカルstatic変数
staticは 関数内でも使用できます。
void func()
{
static int count = 0;
}特徴
| 項目 | 説明 |
|---|---|
| スコープ | 関数内 |
| 寿命 | プログラム終了まで |
| 配置 | data/bss |
つまり
スコープ = ローカル
寿命 = グローバル
という少し特殊な変数です。
つまり、見える範囲(スコープ)は関数内に限定されるのに、
実体は関数の外(静的領域)に存在しています。
staticを使った公開範囲の考え方については、別の記事で詳しく解説しています。


グローバル変数との違い



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



メモリ配置は同じだけど、スコープが違うんだ。
| 変数 | スコープ |
|---|---|
| グローバル変数 | 全ファイル |
| staticグローバル | そのファイルのみ |
例
static int counter;この変数は 同じファイルからしかアクセスできません。
これは 内部リンク(internal linkage) と呼ばれます。
グローバル変数は外部から参照可能(external linkage)ですが、
staticグローバル変数はそのファイル内に閉じた変数になります。
実務での使い方
組み込み開発では、static変数はよく使われます。
例
状態保持
static int state;カウンタ
static int retry_count;モジュール内部データ
static uint8_t buffer[256];外部からアクセスさせないデータ を作るときに便利です。
static関数
staticは関数にも使われます。
結論から言うと、static関数とは
👉 同じファイル内からしか呼び出せない関数です
static関数についてはこちらの記事でも詳しく解説しています。


よくある誤解
staticは「一度しか初期化されない」から速い
→ ❌ 本質ではないです。
重要なのはここまで説明してきた「配置場所と寿命」
まとめ
static変数のポイントをまとめます。
- static変数は 値を保持し続ける変数
- stackではなく data / bss領域 に配置される
- 関数内でも使用できる
- staticグローバルは ファイル内だけで有効
- 組み込み開発では状態保持などに使われる
staticは「スコープ」と「寿命」を分離するためのキーワードです。
見える範囲は限定しつつ、値は保持したい。
そのために使われるのがstaticです。
この記事が参考になった方へ
メモリ領域については他の記事でも解説しています。


また、static、const、ポインタ、mallocなど、メモリ領域の理解に関わるC言語文法についても当サイトで解説しています。


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








コメント