2016-05-26 3 views
0

なぜ私は最初のメインが実行中にクラッシュしなかったのか知りたいが、2番目のメインは実際に実行中にクラッシュする。C++の配列オーバーフロー

int main(){ 
    int a[5]; 
    for(int i = 0; i < 70; i++){ 
     cout << i << "=" << a[i] << endl; 
    } 
    return 0; 
} 

int main(){ 
    int a[5]; 
    cout << a[6]; 

    return 0; 
} 
+2

未定義の動作。もっと不思議に思う必要はありません。それは何でもできます。 –

+0

未定義のビヘイビアは何ですか? –

+0

定義されていない動作。この規格では、配列の内部にアクセスする際の動作のみを定義しています。それを超えてアクセスすると、何も起こりませんし、仕様書には何も言われません。クラッシュは単なる選択肢です。 –

答えて

0

あなたは、あなたの配列の定義された範囲外で読もうとします。後者は0から4までしか定義されない(すなわち、a [0]からa [4])。

何が起こるかは、標準によって未定義であり、コンパイラ、現在のメモリ状態などに依存します。メインはどちらも1日 "動作"し、別の日または全くクラッシュする可能性があります。

未定義の動作については、コンパイラは必要な処理を実行できます。

コンピュータプログラミングでは、未定義の動作(UB)は、プログラムの現在の状態(メモリなど)に対して、コードが従う言語仕様による規定の動作を実行していないコンピュータコードを実行した結果です。これは、ソースコードのトランスレータが特定の前提を設定している場合に発生しますが、これらの前提条件は実行中に満たされません。

詳細はclick hereです。

0

@Sami Kuhmonenと同じように、あなたは境界からアレイにアクセスしているのでどちらも間違っています。私はhypotheticの説明を提供することができます(それはコンパイラ、オペレーティングシステム、さらにはプロセッサに依存しますが、真の理由を見つけるには理論上の知識のためにはあまりにも大きな労力が必要です):2番目のmain()スタック上にさらに多くのスペースを割り当てるため、アレイはクラッシュせずに境界から読み出すことができます。