@Nawazと@celtschkは正しいです。あなたのコードは未定義の動作を呼び出すので、どちらの動作も正しいです。それでも、この特定の未定義の動作が見られるのには理由があります。その理由は理解する価値があります。
オペレーティング システムが実行時にプログラムをロードすると、仮想アドレス空間が開かれます。 64 ビット システムでは、仮想空間はアドレス 0 からアドレス 0xffffffffffffffff まで拡張されます。
あなたのシステムは当然、そのような広大なアドレス空間を満たすために必要な実際の物理メモリのほんの一部しか持っていません. さらに、システムは、一度に実行される可能性のあるいくつかの異なるプロセス間でメモリを共有する必要があります。各プロセスには、独自のプライベート仮想アドレス空間があります。
システムの機能は次のとおりです。最初に、新しくロードされたプログラムに小さなメモリ ブロック (おそらく 4 kiB) を割り当て、これをアドレス空間の小さなセグメント (0xffffffffffffff000 ~ 0xffffffffffffffff) にマップします。プログラムは、このスペースに格納されたデータ オブジェクトのスタックを構築します。スタックが 4 kiB を超えて大きくなると、システムは別の 4 kiB を 0xffffffffffffe000 から 0xffffffffffffefff として割り当て、実行中のプログラムに対して透過的な方法でそれを行います。
プログラムが規則正しく規定された方法でスタックを構築して使用する限り、スタックのサイズの制限を認識していないかのように実行されます。ただし、プログラムが無秩序な方法でメモリにアクセスすると、結果はいくつかの要因に依存しますが、システムがプログラムの実際のメモリを割り当てたことのないアドレスへのアクセスである場合、システム例外が確実に発生します。使用する。
さて、この回答では多くの詳細が省略されています。ご存知かもしれませんが、ヒープまたは動的メモリ プールという 2 番目の種類のメモリがあります。 「ディスクの交換」など、他にも要因があります。ただし、ポインターi
がたまたまプログラムが何らかの目的で既に使用しているメモリを指している場合、システム例外は発生しません。それはそのような記憶を指していますか?言いにくい。明らかに、あなたの場合、あるシステムではそうしているようですが、他のシステムではそうではないようです。
ちなみに、@celtschk とは 1 つの小さな点で少し異なります。最新の CPU とオペレーティング システムは、彼が話しているようなシステム障害を防ぐように特別に構築されています。C および C++ 標準は、このような障害が発生しないことを保証していませんが、プログラムがスーパーユーザー特権で実行されない限り、オペレーティング システムは発生します (また、部分的に有効な保護手段が存在する場合でも)。通常のユーザーモード プログラムで不注意にディスクを消去してしまうことについて、あまり心配する必要はないと思います。それでも、組み込みシステムでは、それは別の問題であり、@celtschk はまったく正しいです。