実際に配列を拡大しているわけではありません。コードを詳しく見てみましょう。
int myArray[2];
myArray[0] = 0;
myArray[1] = 1;
0 から 1 までのインデックスを持つ 2 つの位置の配列を作成します。
myArray[4];
配列の 5 番目の要素 (配列に存在しないことが確実な要素) にアクセスしています。これは未定義の動作です。何でも起こりえます。その要素で何もしていませんが、それは重要ではありません。
myArray[2] = 2;
myArray[3] = 3;
ここで、要素 3 と 4 にアクセスし、それらの値を変更しています。繰り返しますが、これは未定義の動作です。作成された配列の近くのメモリ位置を変更していますが、「他には何もありません」。配列はそのままです。
実際には、次のようにして配列のサイズを確認できます。
std::cout << sizeof( myArray ) / sizeof( int ) << std::endl;
配列のサイズが変更されていないことを確認します。ところで、このトリックは、配列が宣言されているのと同じ関数で機能します。配列を渡すとすぐに、ポインターに減衰します。
C++ では、配列の境界はチェックされません。主にそれが原因で、エラーや警告は表示されませんでした。ただし、配列の制限を超えて要素にアクセスすることは未定義の動作です。未定義の動作とは、すぐには表示されない可能性があるエラーであることを意味します (一見良いが、実際にはそうではありません)。プログラムでさえ問題なく終了できるようです。