static変数とは?C言語のメモリ配置とグローバル変数との違いをわかりやすく解説

目次

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 = 1data領域
static int abss領域

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言語文法についても当サイトで解説しています。

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

組み込みソフトエンジニアとして働きながら、
C言語・メモリ・ポインタなどの基礎から実務まで解説しています。

副業・キャリアについても実体験ベースで発信中です。

X・Qiita・noteでも発信しています。
X:更新情報・日常
Qiita:技術発信
note:キャリア・副業

▼まずはここから読むのがおすすめ
C言語文法シリーズ
メモリ領域解説シリーズ
割り込み処理解説シリーズ
ソフトウェア設計解説シリーズ
キャリアと副業ロードマップ

コメント

コメントする


目次