2016-12-05 104 views
-2

我想寫一個算法,按升序(插入排序)對列表中的元素進行排序。通過將所有以下變量(和數組)定義爲int來啓動主函數。 這裏是排序功能:插入排序中的分段錯誤在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--; 
     } 
    } 
} 

b爲列表中的元素的數量,以及在主被初始化爲0。

當在主函數中使用正整數表進行排序時,它會按照所需的方式對它們進行排序。但是,如果某些值爲負數,程序會產生分段錯誤。

有人能幫我弄清楚錯誤嗎?謝謝!

+0

分段錯誤幾乎肯定意味着您正在訪問不屬於您的內存。研究你的內在循環。你是否發現任何可以通過小於0的索引來訪問'list'的方式? –

+1

在使用'i'作爲循環增量的for循環中改變'i'的值通常是一個壞主意。當你在while循環中第一次遞減時,它變爲0,然後你試圖訪問'list [-1]' – bruceg

+1

@bruceg可疑(我在編寫解析器跳過字符時做了很多),但是在這個情況當然是。 – YoYoYonnY

回答

2

在第一環路(即,當i爲1),那麼這部分

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

相同

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 

這也沒關係。但下面的語句將

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

的非法訪問很可能是賽格故障的原因。