10771077ネットワークhct97ポイントC0M:Baiduはああヤン57-56-83-12コードを検索します
現在のポストの正式開始する前に、コードの一部を見て、コードの思考がある場合があるかもしれません。
INTのmain() { int型J、B [10]。 {(; J <= 10 ++ J J = 1)のための B [J] = 0; } }
このコードを読んだ後、彼らは何のピットがないと感じた場合、このコードは、それがああBクロスボーダーの配列につながる1から10およびB [10]にメモjの範囲を取ることを望むかもしれません。まだ結果を考慮?それのいくつかのメモリ知識で見てみましょう。
ローカル変数、グローバル変数(静的変数とグローバル変数)、スタック変数:C / C ++の高校における三つの変数で我々
ローカル変数は、次のようなメモリ割り当てられたメモリ部における通常のコンパイラのスタック空間のプログラマで変数を定義した場合:
INT B [10]、J。
次のようなメモリ、スタティックメモリにコンパイラによって割り当てられたグローバル変数スペース、
int型のx、yの; //グローバル
INTメイン(){
静的int型M、N; //スタティック
}
次のようなmalloc関数やヒープメモリの新しいアプリケーションの期間を使用してプログラマによるスタック変数、
iが新しいINTをINT = * * A =新たなINT [10]; //動的メモリ割り当て
メモリが提供する可視コンパイラは、論理的に別のセクション権プログラマアクセス・メモリに分割し、各セグメントのサイズは、独自の空間を有し、プログラマああの大きさはもちろんで使い果たした後、メモリ不足があるでしょう典型的なスタックオーバーフローなどのエラー、
再び彼らが配置されたかのメモリに、私は同じ変数領域に複数の異なる変数を定義したときに、問題について考え、後のストレージ変数を学ぶのか?
たとえば、私は2つのローカル変数を定義します
int型のA、B;
だから、最後に最初のコンパイラがある、またはbアサインアドレスへの割り当てアドレスに?割り当てアドレスに(これはそれを考えるためにも使用?確かに最初の割り当ての友人を定義)した後、最後にアドレス上記のBアドレス、またはbのアドレス上記のアドレスですか?これは、マップが正確である二つのマップを下回っていますか?
ただ、これらの2つのアドレスが見た目にプリントアウトされている答えを知りたいです。小扁は、読者が自分自身を印刷することをお勧めされ、ここでは印刷されません。
結果は正しいままであるBのアドレス、より高いアドレスの印刷です。
しかし、ここで注意、bはローカル変数である、すなわち変数がに格納されているスタック領域我々は定義スタック領域内の変数ことが見出された結果に基づいて、以前の高いアドレス領域に割り当てられた定義された変数は、定義後変数が下位アドレスに割り当てられていますエリア(左)。
それはそれのヒープと静的なメモリがある場合は?
静的なint型のA、B;
int型* =新しいint型、* B =新しいint型;
それについてのアドレスを自分で印刷します。
発見ヒープおよびスタティックメモリスタック領域に反して、ヒープ領域変数/スタティックメモリである低に割り当てられた第1のアドレスエリア、高いアドレス領域の割り当て(右)で定義された変数で定義された変数は。
結論として、ある高い預金の低い、低預金を持つグローバル/静的/低スタック変数とローカル変数が。
(ハイメモリ(メモリ不足)は、アドレスが高い(低い)同時変数定義の複数の下位アドレスから(高い)アドレスを占有されている方法を説明します)
(ローにどの程度理解さ:/メモリセルの各変数が格納されている高い割合ユニット・アドレス・バイトに低いから可変のバイトアドレスが割り当てられ、それは、データを読み出します)
上記のコードを見て戻って:
INT J、B [10]。
2つのローカル変数は、それとの高低預金を覚えていますか?DIYそれの分布についての彼らの記憶を描きます。
(アレイ上の図は、忘れて経時的に変化を描く、実際配列bである)コードを見て、後のメモリ割り当ておよびb jのアレイクリア
INTのmain() { int型J、B [10]。 {(; J <= 10 ++ J J = 1)のための B [J] = 0; } }
10、B [10]配列境界原因のJ値は、結果がクロスボーダーbの結果である場合(10)記憶空間の高アドレスINT(4バイト)を占有し続ける、それは、B明らかです[ 】アドレスjの10、10] = 0、J = 0と等価である[B、占有、無限ループをもたらします。
、アレイの実際の動作であり、アドレスjは、唯一J <= 10にする必要があり、実際の操作は、条件J <= 11またはJ <=となる場合、次いで1-2境界bのメモリセルが考慮されますここで(理論的結果12へ)
定義を交換するために、jとB [10]の場合:
INT B [10]、J。
彼らはなぜそれを自分を説明し、ああデッドサイクルを表示されません。
ここではそれを使用するための低メモリグローバル/静的/低スタック変数があることを忘れないでください、高い預金低いとローカル変数を議論します。
私たちは、Jローカル変数aとb [10]は、あるアプリケーション・ヒープ・メモリから、再定義されます
int型* J =新しいint型、* B =新しいint型(10)。
その後トラバース再び、ああ、無限ループがありません
INTのmain() { int型* J =新しいINT、* B =新しいINT [10]。 {(; * J <= 10 ++ * J * J = 1)のための B [* J] = 0; }
}
この場合、jにおける、bは、jのみアドレス未満を占め、高いアドレス空間を占有し続ける方法を境界bの関係なく、ヒープ上で、比較的低アドレスに位置するj個のB。(カスタムああ、死のサイクルへの変更を注文します)
ここに私のテストコードを添付
書式#include <iostreamの> 名前空間stdを使用。 INT X、Y。 INTメイン() { COUT << "グローバル変数:\ n"。 COUT << "&X:" <<&X << "&Y:" <<&Y << ENDL。 静的int型M、N。 裁判所未満<< "static変数ます:\ n"; COUT << "&M:" <<&M << "&N:" <<&N << ENDL。 裁判所未満<< "ヒープ変数ます:\ n"; int型*新しいINT [10]、*私は新しいint型=を=。 // int型I、[10]。 (* I 1 =; * I <= 11; ++ * i)について{ [* I] = 0; } のために(* I = 0。* I <= 11; ++ * I){ COUT << "&[" << * I << "]:" <<&[* I] << ENDL。 } coutの<< "&I:" << I <<てendl; ] [削除]; // [削除]私; //ここでエラーがここにポインタinvaildになります一度私のスペースのために国境を越えたアカウントに、[]私はスペースが解放によって占められているという事実は、その後、リリースを削除するため 裁判所未満<<「スタック変数:\ "N-; int型B [10]、J; のため(J = 1; J <= 11; J ++){ B [J] = 0; } (J = 0; J <= 11; +。 J +){ COUT << "&B [" J << << "]:" <<&B [J] << ENDL; } COUT << "&J:" << ENDL <<&J; }