興味深い小さな問題ではC ++のメモリ割り当て(オリジナルのブログの庭すでに掲載された記事ではその方法を書くための再利用マークダウンすることはできません)

次のコードのテスト環境: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

おすすめ

転載: www.cnblogs.com/XiaoXiaoShuai-/p/12452795.html