0

したがって、動的に割り当てられた配列を使用しており、5つの要素を保持するように設定しました。したがって、0〜4になります。必要に応じて予約する関数を作成しましたが、[5]で配列に値を割り当てたときに、予期したプログラムクラッシュが発生するかどうかを確認したいと思いました。しかし、エラーはありません。[6]までは。

これが私のコードです:

int* dynamic_arr;
dynamic_arr = new int[5];

for(int i = 0; i <= 100; i++){
    dynamic_arr[i] = i;
    used++;
    cout << dynamic_arr[i]<<endl;
}

出力は次のとおりです。

0 //i[0]
1 //i[1]
2 //i[2]
3 //i[3]
4 //i[4]
5 //i[5]  <-- should be out of range

その後、クラッシュします。

より適切な用語がないために範囲外にある配列の部分に値を割り当てることができるのはなぜですか?

ありがとう

OpSrcFTW

編集:答えの人に感謝します、ありがとう。次回投稿する前にもっと読みますので、ごめんなさい。

4

4 に答える 4

5

配列の終わりを超えてアクセスすると、未定義の動作が発生します。必ずしもクラッシュするわけではありません。何でも起れる。

于 2013-02-19T23:33:54.320 に答える
4

境界を超えて配列にアクセスすることは、未定義の動作です。何かが起こる可能性があり、再現可能である必要はなく、そこにあると思われるパターンを「理解」しようとしてもほとんど意味がありません。

于 2013-02-19T23:33:47.657 に答える
4

配列のサイズを超えてアクセスすると、未定義の動作が発生します。未定義の動作には、コードのクラッシュ、完全に正常に動作する、あるコンピューターで動作し、別のコンピューターでは動作しない、コンピューターを再起動する、ユニバース全体を破壊するなどが含まれます。

于 2013-02-19T23:35:36.173 に答える
2

他の人がすでに指摘しているように、未定義の動作があるため、クラッシュが発生する可能性はありますが、コードは機能しているように見えることもあります。

あなたのような場合、割り当てたメモリの終わりを少し超えてアクセスしたときに機能しているように見えるのはかなり一般的です。フリーストアのメモリを管理するコードは、多くの場合、リクエストサイズを、2の累乗など、便利と思われる次のサイズに切り上げます。そのため、目に見える問題なしに書き込むことができるように要求したものの終わりを過ぎて、少なくとも少しのメモリがあることは特に珍しいことではありません。

もちろん、それを当てにすることはできません。同じフラグを使用する同じコンパイラなどでも、標準ライブラリは、ターゲットマシンで使用可能なメモリの量に基づいて、次のように動作する方法を決定できます。使用可能なRAMが十分にある場合はパディングを増やして速度を最適化し、使用可能なRAMが少ない場合はパディングを減らしてメモリ使用量を減らします。

そのため、特定の時点でクラッシュに依存することはできませんが、これは、テストしたり、移植する場合にのみ心配する必要があると考えたりすることで解決できる場所でもありません。コード。

于 2013-02-19T23:41:59.193 に答える