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

目次

メモリ領域解説シリーズ

本記事は「メモリ領域解説」シリーズの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 = 1data領域
static int abss領域

初期値による違い

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はシンプルなキーワードですが、
メモリ構造を理解するうえで非常に重要な概念です。

この記事が参考になった方へ

メモリ領域については他の記事でも解説しています。

メモリ領域解説シリーズの全体像はこちら

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

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

お問い合わせはこちら

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

この記事を書いた人

コメント

コメントする


目次