2017-01-28 12 views
-2
#include <iostream> 
using namespace std; 

int main(){ 
    int a[3], no; 
    cout << "Index Value\n"; 
    for(int i = 0; i < 100; i++){ 
     cin >> no; 
     a[i] = no; 
     cout << i << "\t" << a[i] << endl; 
    } 
    return 0; 
} 

ここでは[3]を初期化しました。 forループでは、a []に入力を100回入力し、インデックスは[3]を超えています。
iが4の場合、の直後にセグメンテーションエラーが発生しないのはなぜですか?です。インデックスを印刷0 4. に等しいとき
入力
1 2 3 4 5 6 7
出力
Index Value 0 1 1 2 2 3 4 0 5 5 6 6 7 7
出力が間違っています。期待される4
セグメンテーションエラーが発生しないのはなぜですか?

+1

境界外索引は未定義の動作です。定義されていない動作とセグメンテーションフォールトを検索します。 – P0W

+2

UBは何かが可能であることを意味し、セグメント・フォルト・エラーを引き起こす必要はありません。 – songyuanyao

+0

i init a [33] = 120&a [33]を印刷すると、120が印刷されると仮定します。 – Sparrow

答えて

1

残念なことに、デバッグプログラマーにとって、CおよびC++プログラムは、配列の最後を過ぎて書き込むとsegfaultすることはありません。代わりに、通常はポインタの算術演算が何であれ、静かに上書きします(OSが許可している場合)。これはしばしば他の変数やプログラムコードを上書きし、混乱して予測できないエラーを引き起こします。

標準ではこれは「未定義の動作」つまりコンパイラとランタイムが好きなことをすることができるため、ここでは「通常」という言葉を使用しました。

開発とテストの際には、electricfenceなどのライブラリを使用すると非常に便利です。このライブラリはメモリ操作に余分なチェックを入れ、プログラムが期待通りに機能しなくなります。

関連する問題