2012-11-28 90 views
0

我有交換功能,像這樣:使用交換函數void指針

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

我叫交換主像這樣:

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]); 
} 

現在,交換似乎工作正常,但是代替用另一個交換1值,它將交換2個值與另外2個值。例如,當我做交換(0,1,PTR),我得到的陣列

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

當我應該得到:

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

相反交換4和7,它是交換4 ,7與9,2。它爲什麼這樣做?

+0

看起來你是一個64位系統,默認情況下爲您提供了64位上,儘量的sizeof ARR的一個printf [0]和sizeof int來驗證,你可以傳遞一個額外的參數來存儲大小,並且在memcpy中使用一個char [size]緩衝區,或者如果你確認它們是不同的地址,就使用xor swap(換句話說,不要交換1和1) – technosaurus

回答

5

swap()將數組視爲指針數組,但實際傳遞的數組是int類型的數組。顯然,你的系統是這樣的,一個指針的大小是兩個,所以每次它交換一個「指針」,它實際上是交換兩個整數。

你會需要你的交換程序是這樣的:

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

哪個那麼如果'i' /'j'>'size/2'可能會出現段錯誤 –

+0

啊,是的,類型是'void * arr []',而不是'void *'... –

+0

這似乎是最好的東西要做,謝謝。 – me45