2016-12-05 4 views
-2

J'essaie d'écrire un algorithme qui trie les éléments d'une liste dans un ordre croissant (tri d'insertion). Je démarre la fonction principale en définissant toutes les variables (et tableaux) suivantes comme int. Voici la fonction de tri:Erreur de segmentation dans insertion-tri en 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 étant le nombre d'éléments dans la liste, et un être initialisé à 0 en principale. Quand j'utilise la fonction principale avec une table d'entiers positifs dans la fonction principale, elle les trie de la manière désirée. Cependant, si certaines valeurs sont négatives, le programme génère une erreur de segmentation.

Quelqu'un pourrait m'aider à comprendre l'erreur? Je vous remercie!

+0

Une erreur de segmentation signifie presque sûrement que vous accédez à de la mémoire qui ne vous appartient pas. Étudie ta boucle intérieure. Voyez-vous un moyen d'accéder 'list' via un index inférieur à 0 ou supérieur au nombre d'éléments moins un? –

+1

C'est généralement une mauvaise idée de changer vous-même la valeur de 'i' dans la boucle for qui utilise' i' comme incrément de boucle. Lorsque vous décrémentez i la première fois dans la boucle while, il devient 0, puis vous essayez d'accéder 'list [-1]' – bruceg

+1

@bruceg Debatable (je le fais souvent quand j'écris des parsers pour passer des caractères), mais dans ce cas est certainement. – YoYoYonnY

Répondre

2

Dans la première boucle (à savoir lorsque i est égal à 1), alors cette partie

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

est le même que

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

qui est OK. Supposons maintenant que list[0]>list[1] est vrai. Ensuite, vous allez faire:

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 

qui est également OK. Mais la déclaration suivante sera

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

L'accès illégal est susceptible d'être la cause de la faute de seg.