0
#include <iostream>

using namespace std;

int main(){
    int a[6] = {5, 2, 4, 6, 1, 3}; // create an array of size 6
    int j, key = 0;
    for (int i = 1; i < 6; i++) {
        key = a[i];
        j = i - 1;
        while ((j >= 0) && (a[j] > key)) {
            a[j + 1] = a[j];
            j -= 1;
        }
        a[j + 1] = key;
    }
    for (int l = 0; l < 6; l++) { 
        cout << a[l];
    }
    return 0;
}

コードが準拠する配列を使用して挿入ソートコードをテストしようとしていますが、a.out ファイルを実行しようとすると、「セグメンテーション違反」が表示されます。禁止されたメモリの場所にアクセスしようとしていますが、コードのどこにエラーがあるのか​​ 疑問に思っています. また、私が取り除く場合

for (int l = 0; l < 6; l++) { 
    cout << a[l];
}

エラーは見つかりません。

4

2 に答える 2

4

変数jは初期化されていないため、最初にアクセスしたときは何でもかまいませんa[j]。これにより、セグメンテーション違反が発生します。(int j,key =0;のみに設定しますが、 には設定key0ませんj。)

コードを常に でコンパイルします-Wall。これにより、初期化されていない変数の使用について通知されます。(訂正:私のgcc 4.7はそれをキャッチしません。なんて不自由です。)

(印刷を削除するとエラーが消える理由は、コンパイラの最適化がオンになっているためです。コンパイラは、計算された値と配列で実用的なことを何も行わないことに気付き、すべてをビンに投げて空のプログラム。)

于 2013-02-14T21:27:51.867 に答える
1

ソートは stl のアルゴリズムの 1 つです。あなたは本当に std::sort のように使うべきです

std::sort( a, a+6 );

PS: j は、行で使用する前に初期化されます

j = i - 1;

それはクラッシュの原因ではありません。

于 2013-02-14T22:17:41.497 に答える