2013-03-31 12 views
-4

Lors du tri d'un tableau à l'aide d'un algorithme appelé tri de tubes, je l'ai implémenté et quand je l'ai exécuté, j'ai une erreur de segmentation. Même si j'ai cherché sur le net et là où aucune erreur similaire, j'ai décidé de poster ici. Cette erreur aurait pu être parce que j'ai mis la taille du tableau aux dans la boucle for à la taille du tableau, y at-il une meilleure façon d'écrire ce code? Voici la source.Segmentation Fault on sort

#include <stdio.h> 

void TuborSort(int* array) { 
    int aux[5] = { 0, 0, 0, 0, 0 }; 
    int i; 

    for (i = 0; i < sizeof(array); i++) { 
    aux[array[i]]++; 
    } 

    int j = 0; 
    for (i = 0; i < 5; i++) { 
    while(aux[i]-- > 0) { 
     array[j++] = i; 
    } 
    } 
} 

int main() { 
    int array[6] = {2, 5, 1, 4, 1}; 
    int i; 

    TuborSort(array); 

    for (i = 0; i < sizeof(array); i++) 
    printf("%d ", array[i]); 

    return 0; 
} 
+1

taille de tableau est 6 ... la taille des aux est 5 – maditya

+0

'int * array' -> sizeof (array) // comme taille de pointeur – BLUEPIXY

+3

7 downvotes? !! Pourquoi ? – cnicutar

Répondre

3

vous dites aux[array[i]]++ et aux 5 éléments est seulement à long. Donc le deuxième élément dans array (5) est trop grand pour être utilisé comme indice pour aux. Comme une note de côté


, la façon dont vous utilisez sizeof est mauvais, vous devez passer la longueur du tableau comme un paramètre supplémentaire.

Comme le fait remarquer Alexeï, dans le main pour devrait être:

size_t i; 
for (i = 0; i < sizeof(array)/sizeof(*array); i++) 
+1

La note de côté est plutôt critique –

+0

'sizeof' est faux dans les deux endroits. –

+0

@AlexeyFrunze Bon appel, je n'avais pas remarqué le second 'sizeof'. – cnicutar

3

sizeof(array) dans votre fonction TuborSort() ne convient pas. Comme vous l'avez déclaré array est int * et non tableau de 6 entiers, ce qui n'est pas ce que vous voulez.

En outre, au lieu de sizeof, vous souhaitez le nombre d'éléments dans le tableau, qui est sizeof(array)/sizeof(array[0]).

0

C'est une erreur très courante pour les personnes qui connaissent Java, le pointeur en c et en C++ est d'une taille dérivée de l'architecture généralement 32/64 bits sur PC.

une fois que vous passez un pointeur vers un tableau, vous devez lui envoyer sa longueur, sinon vous ne pouvez pas connaître sa longueur.

+0

32/64 bits - dit qui? –

+0

@AlexeyFrunze ajouté habituellement – 0x90