6

なぜこれが機能するのか、誰かが私に説明してもらえますか。配列は静的で拡張できないと思っていましたが、このコードは私の以前の知識に反しています。

#include <iostream>
using namespace std;
int main(){

    int test[10];
    int e = 14;

for(int i = 0; i < e; i++){
    test[i] = i;
    cout << "  " << test[i];
    }
return 0;
}

このコードはこれを出力します: 0 1 2 3 4 5 6 7 8 9 10 11 12 13

したがって、基本的にこのプログラムは、存在してはならない配列スペースを使用しています。「e」を 15 に設定しようとしましたが、機能しません。

4

4 に答える 4

11

配列のサイズ固定されており、拡張されておらず、その境界を超えると未定義の動作になります。あなたが観察したことは、未定義の動作 (UB) の可能性のある結果の 1 つです。この場合、UB が配列の拡張と一致するパターンを提案するのは不運でした。

于 2012-10-08T17:23:57.010 に答える
4

未定義の動作です。合法的に割り当てられたintはまだ10個しかありません。この場合は機能しているように見えますが、プログラムの形式が正しくありません。

于 2012-10-08T17:24:23.423 に答える
2

基本的に、アレイによって割り当てられたメモリの境界を超えて書き込みますが、C(およびC ++)はマシンコード(Javaや.NETなどの仮想マシンによって実行される「マネージ」コードとは反対)に直接コンパイルされるため、何もありません。プログラムとOSの間で、明示的に要求していないメモリにアクセスするかどうかを確認します。メモリはいくつかのチャンクに割り当てられます。プロセスがOSにメモリの一部を要求している場合、正確なバイト数は取得されませんが、わずかに多くなる可能性があります。あなたの場合、40バイトではなく56バイトを取得しました。60バイトを取得しなかった理由は、OSのメモリ割り当てと検証メカニズムによって異なります。eが15に設定されたときに機能しないという症状は何でしたか?プログラムのクラッシュ?

于 2012-10-08T17:27:55.253 に答える
1

これは実行時エラーであり、コンパイルエラーではありません。理由は15で失敗し、14ではなく、位置15に到達すると、別のポインタまたはアプリケーションに割り当てられているメモリにヒットしたためです。たまたま、インデックス11、12、13、および14は、まだmallocされていない連続したメモリ位置です。

于 2012-10-08T17:27:58.960 に答える