C および C++ で静的変数はどこに格納されますか?

スタティックがどこに行くかは、ゼロで初期化されているかどうかによって異なります . ゼロ初期化 静的データは .BSS (Block Started by Symbol) に入り、非ゼロ初期化 データは .DATA に入ります


プログラムがメモリにロードされると、さまざまなセグメントに編成されます。セグメントの 1 つは DATA セグメント です .データ セグメントはさらに 2 つの部分に分割されます。

初期化されたデータ セグメント: すべてのグローバル、静的、定数データはここに保存されます。
初期化されていないデータ セグメント (BSS): 初期化されていないデータはすべてこのセグメントに格納されます。

この概念を説明する図を次に示します。


これらの概念を説明する非常に良いリンクは次のとおりです。


実際、変数はタプルです (ストレージ、スコープ、タイプ、アドレス、値):

storage     :   where is it stored, for example data, stack, heap...
scope       :   who can see us, for example global, local...
type        :   what is our type, for example int, int*...
address     :   where are we located
value       :   what is our value

ローカル スコープは、定義されている場所に応じて、翻訳単位 (ソース ファイル)、関数、またはブロックのいずれかに対してローカルであることを意味します。変数を複数の関数から見えるようにするには、確実に DATA または BSS 領域のいずれかになければなりません (明示的に初期化されているかどうかによって異なります)。その後、ソース ファイル内のすべての関数または関数のいずれかに応じてスコープが設定されます。