2014-09-11 57 views
1

這是我的代碼,由於某種原因,我必須使用unsigned long。 gdb告訴我,我有 seg故障。我能幫助我嗎?我自己找不到。最有趣的是,如果我從unsigned long將類型更改爲int,則不存在seg錯誤。我在我的計數排序中有seg故障

代碼是在這裏:

#include <stdio.h> 
int counting_Sort (unsigned long ary[], unsigned long array_size,unsigned long max){ 


    unsigned long counting[max+1]; 
    unsigned long j; 
    for(j=0;j<max+1;j++){ 
     counting[j]=0;//initize to zero 
    } 

     unsigned long i; 
    for(i=0;i<array_size;i++){ 
     counting[ary[i]]++; 
    } 

    unsigned long q; 
    for(q=1;q<max+1;q++){ 
     counting[q]=counting[q-1]+counting[q]; 
    } 

    for(q=0;q<max+1;q++){ 
     counting[q]=counting[q]-1; 
    } 

    unsigned long outputAry[array_size]; 
    unsigned long d; 
    for(d=(array_size-1); d>=0;d--){ 
     outputAry[counting[ary[d]]]=ary[d];// SEG FAULT IS HERE 
     counting[ary[d]]--;//AND HERE 

    } 
    unsigned long m; 
    //for(m=0; m<array_size;m++){ 
     // printf("%lu\n",outputAry[m]); 
    // } 
    return 0; 
}   




int main(){ 
    unsigned long array[7]={2,6,4,0,1,7,9}; 
    printf("before sorting the order is: \n"); 
    unsigned long i; 
    for(i=0;i<7;i++){ 
     printf("%lu\n",array[i]); 
    } 

    printf("after sorting, the new order is: \n"); 
    counting_Sort(array,7,9); 


    getchar(); 
    return 0; 

} 
+0

+1用gdb。我們經常看到用戶試圖用猜測進行調試,而不是用調試器。 – 2014-09-11 01:57:55

+0

如果您還學習準備[最小完整示例](http://stackoverflow.com/help/mcve),那麼您將領先一步。 – Beta 2014-09-11 02:12:48

回答

0

如果你找到了地方,只是不是這個原因。

unsigned long d; 
for(d=(array_size-1); d>=0;d--){ 

d是無符號整數,這意味着d>=0是總是如此。循環不會結束,這就是分段錯誤的原因。

一種方法是改變d到燒焦類型:

int d; 

但如果這不是你想要的,在for循環更改爲:

for (d = 0; d <= array_size - 1; d++){ 
+1

你可以通過'for(d = array_size; d--;)來保持它的減計數' – 2014-09-11 02:20:05

+0

非常感謝! – adamasdfghjkl 2014-09-11 21:04:30