2012-11-28 4 views
0

J'ai une fonction d'échange comme ceci:en utilisant le pointeur vide dans la fonction de permutation

void swap(int i, int j, void* arr[]) 
{ 
    void *temp; 
    temp = arr[i]; 
    arr[i] = arr[j]; 
    arr[j] = temp; 
} 

j'appelle swap principal comme ceci:

main() 
{ 
    int arr[8] = {4,7,9,2,6,7,8,1}; 
    void *ptr = arr; 
    swap(0, 1, ptr); 
    int k; 
    for (k=0; k<8; k++) 
     printf("%d ", arr[k]); 
} 

Maintenant, l'échange semble fonctionner correctement, mais au lieu de permuter une valeur avec une autre, il échange deux valeurs avec deux autres valeurs. Par exemple, quand je fais swap (0, 1, PTR), je reçois le tableau

9,2,4,7,6,7,8,1 

quand je devrais obtenir:

7,4,9,2,6,7,8,1 

Au lieu d'échanger 4 et 7, il est la permutation 4 , 7 avec 9,2. Pourquoi ça fait ça?

+0

il semble que vous êtes sur un système 64 bits qui vous donne 64 bits par défaut, essayez un printf sizeof arr [0] et sizeof int pour vérifier, vous pouvez passer un paramètre supplémentaire pour la taille et utiliser un tampon char [taille] avec memcpy ou simplement utiliser un échange xor si vous vérifiez qu'ils sont des adresses différentes (en d'autres termes ne pas échanger 1 et 1) – technosaurus

Répondre

5

swap() traite le tableau sous la forme d'un tableau de pointeurs, mais le tableau réel en cours de transmission est un tableau de type int. Apparemment, votre système est tel qu'un pointeur a la taille de deux int s, et donc chaque fois qu'il échange un "pointeur", il échange deux entiers.

Vous avez besoin de votre routine d'échange pour quelque chose comme ceci:

void swap(int i, int j, int arr[]) 
{ 
    int temp; 
    temp = arr[i]; 
    arr[i] = arr[j]; 
    arr[j] = temp; 
} 
+0

alors pourrait segfault si 'i' /' j' étaient> 'size/2' –

+0

Ah, oui, le type était' void * arr [] ', pas' void * '... –

+0

Cela semble être la meilleure chose à faire, merci. – me45

Questions connexes