Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C/C++の静的変数はメモリのどこに格納される?データセグメントとBSSセグメントを解説

静的変数(static変数)とは、プログラムが実行されている間ずっとメモリ上に存在し続ける変数のことです。つまり、その寿命(ライフタイム)はプログラム全体の実行期間と同じになります。

これは自動変数(ローカル変数)とは大きく異なる点です。自動変数は、その関数が実行されている間だけメモリ上に存在し、関数の処理が終了すると破棄されます。

静的変数が格納されるメモリ領域

静的変数は、メモリのデータセグメントに格納されます。データセグメントとは、プログラムの仮想アドレス空間の一部を指します。

さらに、静的変数は初期化の有無によって、以下の2つの領域に分けられます。

1. 未初期化データセグメント(BSSセグメント)

明示的な初期化が行われていない静的変数や、ゼロで初期化された静的変数は、未初期化データセグメント(BSSセグメントとも呼ばれます)に格納されます。

2. 初期化済みデータセグメント

一方、明示的に値が代入されて初期化された静的変数は、初期化済みデータセグメントに格納されます。

具体例

static int x = 5;
static int y;

このコードでは、静的変数 x は値5で初期化されているため初期化済みデータセグメントに格納され、初期化されていない静的変数 yBSSセグメントに格納されます。

C言語での動作を確認するサンプルプログラム

次のプログラムは、関数内の静的変数がプログラム終了まで値を保持し続ける様子を示しています。

サンプルコード

#include <stdio.h>

int func() {
    static int i = 4;
    i++;
    return i;
}

int main() {
    printf("%d\n", func());
    printf("%d\n", func());
    printf("%d\n", func());
    printf("%d\n", func());
    printf("%d\n", func());
    printf("%d\n", func());

    return 0;
}

実行結果

5
6
7
8
9
10

プログラムの解説

このプログラムの動作を順番に見ていきましょう。

func() 関数の処理

関数 func() 内では、i が静的変数として宣言され、値4で初期化されています。初期化されているため、この変数は初期化済みデータセグメントに格納されます。その後、i をインクリメントしてその値を返します。

int func() {
    static int i = 4;
    i++;
    return i;
}

main() 関数の処理

main() 関数では、func() を6回呼び出し、それぞれの戻り値を出力しています。

printf("%d\n", func());
printf("%d\n", func());
printf("%d\n", func());
printf("%d\n", func());
printf("%d\n", func());
printf("%d\n", func());

ここで重要なのは、i が静的変数であるため、関数の呼び出しが終わってもメモリ上に残り続けるという点です。通常のローカル変数であれば、毎回4に初期化されてしまいますが、静的変数の場合は初期化が一度だけ行われ、以降は前回の値が引き継がれます。

その結果、出力は「5, 6, 7, 8, 9, 10」となり、呼び出すたびに値が1ずつ増えていくことが確認できます。これこそが、静的変数がプログラムの実行中ずっとメモリに存在し、一貫した値を保持する証拠です。

  1. Microsoft Teamsの録画はどこに保存される?保存場所・ダウンロード・共有方法を徹底解説

    リモートワークやオフィス内でのコミュニケーションにおいて、メッセージングアプリへの需要が急増する中、多くのアプリが人気を集めています。その代表格がMicrosoft Teamsです。最近では、Teamsの録画ファイルがOneDriveに保存され、一定期間後に自動的に削除される仕組みが導入されました。「Teamsの録画はどこに保存されるのか」「録画した動画をダウンロード・共有するにはどうすればいいのか」とお悩みの方は、このガイドが役立ちます。さらに、記事の最後では録画の自動有効期限設定の変更方法もご紹介します。 Microsoft Teamsの録画の保存場所とは?アクセス・ダウンロード・共有の方

  2. Macの写真(Apple Photos)はどこに保存される?保存場所の確認とバックアップ・移動方法を解説

    Macで撮影した写真が「写真(Apple Photos)」アプリの中にしか見当たらず、「いったいどこに保存されているのだろう?」と疑問に思ったことはありませんか?通常のファイルとしてフォルダを探しても見つからないため、多くの方が同じ疑問を抱いています。 その理由は、写真アプリの画像がライブラリファイルという特殊な形式で管理されているからです。ライブラリは普通のフォルダとは動作が異なるため、直接開いて中身を確認することができません。 しかし、方法さえ知っていれば、ライブラリの中身にアクセスしたり、外部ドライブなど別の場所へ移動したり、さらには新しいライブラリを作成することも可能です。この記事では