2016-12-05 91 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 

的非法访问很可能是赛格故障的原因。