2016-12-05 4 views
-2

リストの要素を昇順(挿入の並べ替え)でソートするアルゴリズムを記述しようとしています。次の変数(と配列)をすべてintとして定義して、main関数を開始します。Cの挿入ソートのセグメンテーションフォルト

void sort(int a, int b , int list[], int i) 
{ 
    for(i=1; i<(b); i++) 
    { 
     while(list[i-1]>list[i]) 
     { 
      a = list[i-1]; 
      list[i-1]=list[i]; 
      list[i]=a; 
      i--; 
     } 
    } 
} 

リスト内の要素の数であり、主に0に初期化されるB: ここソート機能です。

私は、正の整数の表を使ってソートを使用するとき、それは望ましい方法でソートします。しかし、値の一部が負の場合、プログラムはセグメント化エラーを生成します。

誰かがエラーを理解するのに役立つでしょうか?ありがとうございました!最初のループでは

+0

セグメンテーションフォールトは、あなたが属していないメモリにアクセスしていることをほぼ確実に意味します。あなたの内側のループを調べてください。 0より小さいか、要素の数よりも少ないインデックスを使って 'list'にアクセスする方法はありますか? –

+1

ループのインクリメントとして 'i'を使うforループの中で、' i'の値を自分自身で変更するのは悪い考えです。 whileループの中で初めて減分すると0になり、 'list [-1]'にアクセスしようとしています。 – bruceg

+1

@bruceg Debatable(文字をスキップするためにパーサを書くときにはたくさんありますが)このケースは確かです。 – YoYoYonnY

答えて

2

(すなわちiが1の場合)、この部分

while(list[i-1]>list[i]) 

はOKである

while(list[0]>list[1]) 

と同じです。今、list[0]>list[1]が真であると仮定します。そうすれば、あなたはそうするでしょう:

a = list[i-1];  ---> same as a = list[0]; 
    list[i-1]=list[i]; ---> same as list[0]=list[1]; 
    list[i]=a;   ---> same as list[1]=a; 
    i--;    ---> Now i becomes 0 

これもOKです。しかし、次のステートメントは、

while(list[i-1]>list[i]) ---> same as while(list[-1]>list[0]) 
                ^^ 
                Illegal access 

となります。不正アクセスはsegフォルトの原因になりがちです。

関連する問題