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