確かに呼び出される2つの変数を宣言a
することはエラーです。コンパイラがそれを受け入れる場合、それは壊れています。ある宣言を別の宣言に置き換えても、エラーが発生しないことを意味していると思います。
配列アクセスは範囲チェックされません。コンパイル時には、配列のサイズがわからないことが多く、言語がわかっていてもチェックする必要はありません。実行時に、チェックによってパフォーマンスが低下し、不要なものにお金を払わないというC++の哲学に反します。したがって、配列の終わりを超えてアクセスすると、未定義の動作が発生します。それが発生しないようにするのはプログラマーの責任です。
無効なアクセスによってセグメンテーション違反が発生する場合がありますが、これは保証されていません。通常、メモリ保護はメモリのページ全体にのみ適用され、通常のページサイズは数キロバイトです。有効なメモリのページ内のアクセスはキャッチされません。アクセスするメモリに他のプログラム変数または呼び出しスタックの一部が含まれている可能性が高いため、そこに書き込むと、想像できるほぼすべての方法でプログラムの動作に影響を与える可能性があります。
安全を確保したい場合は、を使用し、その関数std::vector
を使用してその要素にのみアクセスできます。at()
これにより、インデックスがチェックされ、範囲外の場合は例外がスローされます。また、メモリ割り当てを管理し、例のメモリリークを修正します。