一般に、実行可能ファイルのデータ セグメントには初期化されたグローバル/静的変数が含まれ、BSS セグメントには初期化されていないグローバル/静的変数が含まれます。
ローダーがプログラムをメモリにロードすると、初期化されたグローバル/静的変数は自動的にゼロで埋められます。
C では、関数内の静的変数 (初期化されているかどうかに関係なく) は、変数がローカル/関数スコープ (内部静的と呼ばれることもあります) を持っていることを意味しますが、初期化されているかどうかに応じて、データ/BSS セグメントに残ります。
したがって、fun() が呼び出された回数に関係なく、静的変数はプログラムのロード時に 1 回だけ初期化されます。
static として定義され、関数の外側にある変数は、引き続きデータまたは bss セグメントのいずれかに存在しますが、ファイル スコープのみを持ちます。
コードがコンパイルされると、各オブジェクト ファイルの一部であり、リンケージ エディターによって使用されるインポートおよびエクスポート リストがあります。静的変数はエクスポート リストに含まれないため、他のオブジェクト ファイルにアクセスできなくなります。
static キーワードを除外すると、グローバル変数がエクスポート リストに配置され、他のオブジェクト モジュールから参照できるようになり、リンケージ エディターは実行可能ファイルの作成時にシンボルを検出できるようになります。
絵画的なビューの場合:
+--------- TEXT ---------+ Low memory
| main() |
| fun() |
+--------- DATA ---------+
| int a (global scope) |
| int c (file scope) |
| int e (function scope) |
+---------- BSS ---------+
| int b (global scope) |
| int d (file scope) |
| int f (function scope) |
+------------------------+