次のコードのテスト環境:vs2019
質問をします
そのようなAコードの実装、および何が起こるかを参照してください。
int arr[5] = { 0 };
int main()
{
arr[5] = 1;
}
間違いなく、私がアクセス違反ので、文句を言うだろう、があります。
コードの別の部分を見てください:
int arr[5] = { 0 };
int main()
{
arr[5] = 1;
}
上記のコードと比較してほとんど差が、唯一ARR定義と初期化関数は、外部移動が、エラーなしでプログラムの実行。
コードのように多くの類似した部分があります。
int main()
{
static int arr[5] = { 0 };
arr[5] = 1;
}
同じことが、これはなぜある、正常に実行することができますか?
問題を探求
C++
メモリ5つの領域、すなわち、に分割されているヒープ、スタック、フリー店、グローバル/スタティックメモリと、一定のメモリ領域。
ヒープは:ヒープは、オペレーティング・システムは、プログラムのための特別なメモリ、動的メモリ割り当てによって維持される、用語のオペレーティングシステムであるC
言語malloc
用いてヒープ上に割り当てられたメモリからfree
割り当てられた対応するメモリの解放を。
スタック:機能の間に、メモリセルは、ローカル変数の中で機能することができ、スタックに自動的に機能の実行の終了時に解放されたメモリセルに作成しました。スタックプロセッサ命令セット、高効率が、割り当てられたメモリの限られた量のメモリ割り当て動作を制御します。
無料店舗:空き記憶領域がされC++
に基づいnew
てオペレータの抽象的な概念new
メモリオペレータアプリケーション、メモリがある自由店。
グローバル/静的格納領域:このメモリは、プログラムのコンパイル時に既に割り当てられているが、プログラム全体の実行中に存在しています。以下のようなグローバル変数、静的変数。
一定のストレージ領域:これは、彼らがされている店舗内の特殊な記憶領域である常量(const)
、変更することはできません。
:上記の問題は、二つの領域に関連するスタックとグローバル/静的記憶領域。
個人的な憶測
これらの知見に基づいて、私は少し早すぎる憶測があります。
- スタックスペースは、私が定義されている場合は、所定のシステムの優れた分布で
int arr[5]
、システムはIスペースの5つの* 4バイトは、システムは(32ビットシステム)を与えることはできませんアドレス空間を超えて上のデータにアクセスするように私を。 - グローバル/静的記憶域は、私が定義されたときに、異なっている
int arr[5]
私には、システムのリターンを最初のアドレスを、私はあなたが20バイトのアクセスコンテンツの外側もでき、最初のアドレスに応じたコンテンツの20のバイトへのアクセスを持っていないだけ。arr