10

我々は変数を作成し、それを初期化しない場合は、その後、ごみ値と呼ばれるいくつかの(ランダム)番号が割り当てられています。この値が変数に割り当てられているどのようにuninitiliazed変数はどのようにガベージ値を取得しますか?

  • これの背景にあるコンセプト/メカニズムは何ですか?
  • これはCでのみ起こりますか?
+0

私は時間を非難する最後だろう予期せぬタイプの質問ですが、それほど明白ではありませんか? –

+4

@DrJokepuもし私には明らかだったのであれば、私は時間を無駄にしません。 –

+0

@Ravi、答えはもちろん明らかではありません。私の言いたいことは、これは私の学校の課題からの一連の質問のようです。それは、元の質問者が自分の質問に対する回答を知っていたという印象を与えるように質問が構成されているからです。 –

答えて

26

ごみ値は値が既にあるむしろ、割り当てられありません。変数を割り当てるときは、メモリを予約しています。上書きするまで、そのメモリには以前にあった "ランダムな"情報が含まれます。

メタファーとして、土地を買うような変数を割り当てることを考えてください。あなたがそれを使って何かをするまで(家を建てるまで)、土地にはすでにゴミ箱があります(古い崩壊家のように) 。

一部の言語は自動的にゼロで新たに割り当てられた変数を記入します - これは行うには時間がかかります。 Cのようなより多くの "do-it-yourself"言語では、この余分な振る舞いは保証されていません(ただし、システムによっては、セキュリティ対策のように言語に関係なくメモリがクリアされます)

+0

ああ!私よりもうまくいって:)。すばらしいです! +1 – vpram86

+1

たとえば、MSVCはすべてをデバッグモードで0xccccccccに初期化します(時には非常に役立つことがあります)。 –

+7

私は「土地の一部」のメタファーが好きです。 +1 –

2

我々は変数を作成し、それを初期化しない場合、何も起こりません。その変数から値を読み取ると、変数が今見つかったメモリからデータを取得します。それは可能性の変数are placed in memory with some degree of randomness.

2

誰も明示的grabage値を代入していないという理由だけで、ゴミ/ランダムな値のように見えます。変数を作成すると、変数の位置のみが決定され、その値は決定されません。それが私たちが初期化している理由です。ゴミ値は、古いプロセスによって同じメモリ上のいくつかの以前の操作から来るかもしれません!それで何かを保持することができます。私はそれがかなり良い数の言語を保持していると思います。私はリストについてはわからない! :)

6

メモリはさまざまな時点で使用され、あなたの申請。たとえば、アプリケーションの呼び出しスタックが大きくなったり縮小したりすると、メモリ内の同じ場所が何度も上書きされることがあります。覚えておくべきことは、メモリの一部が破棄されたときにはゼロにされないため、メモリ内のその場所に新しい初期値を指定しないと、再度使用するときに古い "ガベージ"値が得られることです。

一部languagesstructure implementationsは、使用されるようにメモリをデフォルトで初期化します。他の人はそうしないので、あなたの言語の文書を慎重に読んで、何を期待するかを知ることが重要です。

1

C標準は言う:

実装:https://stackoverflow.com/a/36725211/895245概要:で、実装の詳細な検査セグメンテーションフォルトは、グローバル変数のための法的な)

  • ゼロである

    • ローカル:アドレスが書き込まないので、何があったん以前
    • グローバルに使用されます:.bss
  • 関連する問題