2011-07-21 7 views
2

グローバル変数と静的変数は常に0に初期化されていると言います。私の質問は、バイナリには初期化されていないデータとは別のセクションがあるのです。オペレーティングシステムとCとプロセスメモリ割り当て

私は次のコードを書いた -

int i; 
int j=0; 
static int k; 
static int l=0; 

int main() 
{ 
    static int m=0; 
    static int n; 
    printf("%d, %d\n",i,j); 
    printf("%d, %d\n",k,l); 
    printf("%d, %d\n",m,n); 
    return 0; 
} 

を、出力がいた -

0, 0 
0, 0 
0, 0 

私はbssセクションのobjdumpのの出力を確認してのみ、このセクションでは、変数を含んでいました。しかし、リンクあたりとして - 通常

http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html

、各プロセスでは、その プロセスで使用できる仮想メモリがそのアドレス空間と呼ばれています。各プロセスのアドレス空間は、通常 で、次の図のように6つのセクションに分かれています。環境セクション - 環境変数の格納に使用され、 コマンドライン引数。関数のメモリを格納するために使用されるスタック 引数、戻り値、および自動変数。 2つのデータセクション(初期化された と初期化されていない静的およびグローバル変数)と実際のコードが保存されているテキストセクション の2つのデータセクションを含むヒープ(フリー ストア)

私はちょうど混乱しています。なぜ2つのデータセクションがある場合、すべてのデータが.bssセクションに置かれるのですか?また、.dataには何が含まれているのかを理解したいと思います。

誰か助けてもらえますか?

+0

'.bss'セクションは長さ(およびセクションヘッダー)としてバイナリに '保存'されます。明示的にゼロを格納する必要はありません。非ゼロ要素を持つ構造体の場合、初期化された値は '.data'セクションに格納されます。最近の多くのコンパイラでは、定数文字列は '.text'セクションに格納されますが、伝統的には定数ではなく' .data'セクションに格納されます。これには '伝統的に'かなり古い定義が必要ですが、C89標準より前では、Cコンパイラは一般的に読み取り専用の定数文字列をサポートしていませんでした。 –

答えて

5

.dataセクションは、通常、コンパイル時に既知の値、またはコンパイル時および静的配列ブロックで知られている文字列などの定数メモリの大きなブロックを持つ変数に予約されています。また、.bssセクションには、.dataセクションにゼロを格納することはあまり意味がないため、初期化されていない変数またはゼロ値の変数が格納されます。

+0

したがって、基本的には、グローバル変数を0で初期化しても、.bssに格納されます。私は同じことを確認し、一度他の値で変数を初期化すると.dataに移動します。お返事をありがとうございます。 –

+0

.dataには、スペースを取っているブロック数が0のブロックがいくつかあるメタデータがあったのは奇妙なことでしょう。 –

関連する問題