2012-01-09 2 views

答えて

2

ローカル変数が宣言されると、コンパイラは、変数が格納される囲み関数のスタックフレーム内にスロットを割り当てます。そのスタックフレームがセットアップされる前に、メモリ内のその特定の場所にあった値(通常、そのスペースを占有しているスタックフレームの誰かの関数呼び出しから)が何であれ、その変数の初期の内容になります。

場合によっては、初期化されていない変数は意図的にいくつかの値に設定されていますが、ほとんどランダムではありません。例えば、デバッグmalloc()は、新たに割り当てられたブロックのすべてのワードを0xbadf00dに設定し、メモリが割り当てられていないことを示すマーカーとして機能することがあります。したがって、構造体メンバは、前にあったもの以外の何かに初期化されるかもしれません。私はスタック変数に対してこれを行うコンパイラについては知らないが、存在する可能性がある。

+0

本当にメモリ値を '0xbadf00d'に設定していますか?そのようなヘックスの使い方を知ってうれしいです。 – Amumu

+0

@Amumu:はい、そうです。マイクロソフトのデバッグCRTの動作を説明するページ[here](http://www.nobugs.org/developer/win32/debug_crt_heap.html#table)があります。 –

3

これは無作為に生成されたものではなく、残存メモリです。

毎回、未使用のメモリをすべて消去することは非常に効率的ではありません。したがって、メモリはOSに解放され、利用可能になります。新しいメモリを要求すると、このメモリの一部が取得されます。このメモリは誰にも所有されていませんが、解放されてからはまだゴミが残っていますが、クリアされません。

2

Cが割り当てるメモリをクリーニングしていません。これらの値は、メモリ内の割り当てられた場所の「残り物」です。

Cは原則としてプログラマからの操作を隠すわけではありません。あなたが変数を初期化するように頼んだのではないので、あなたのためにそれをしないので、宛先メモリ内の '上'/'下'と同じビットは変更されません。

1

cの単位化された値の値は、メモリアドレスに格納された値が何であったかによって異なります。無作為化されていません。

2

変数は、いくつかの分かりやすい値で初期化のオーバーヘッドを避けるために未定義の値を持つことができます。したがって、それは間違いなくランダムに生成されません(それは自明ではありません)。最初に保持されている変数の値は、その時点で変数のメモリ位置にあるものだけです。

1

変数を宣言すると、その変数の値を保持するメモリ領域が既に存在します。明示的に何も設定しないと、以前にその場所に格納されていた値がすべて含まれます。プログラムによって意図的に無作為に生成されたものではなく、そこに存在する値だけです。

1

変数の宣言は、そのような型の変数が1つあることをコンパイラに示すものです。変数の定義はそのためのメモリを割り当てます。割り当てられたメモリは、stackauto変数)、heap(動的に割り当てられたメモリ)などであることができる。static変数でない限り、初期化されていないデータセグメントからメモリが割り当てられる。だからあなたが見ているランダムな値は、以前にそのメモリ位置に保存されていた値だけです!したがって、それらを使用する前に変数を初期化することが推奨されます(最初に)。つまり、初期化されていない変数/ポインタを使用/参照解除しないでください。

メモリ内のプログラム構造に関する詳細はhereです。

希望すると助かります!

+0

はい。助けになる。リンクありがとう。 – Amumu

関連する問題