2013-05-14 48 views
2

我正在寫一些學校項目,並且需要交換兩個void *指針數組。我可以用類似下面的代碼做到這一點:在C中交換不帶memcpy的void *指針數組項目#

void swap(void *base, int len, int width) 
{ 
    void *p = malloc(width); 

    memcpy(p,base,width); 
    memcpy(base,(char*)base+width,width); 
    memcpy((char*)base+width,p,width); 

    free(p); 
} 

但我需要交換項目,而不memcpy的,只有使用malloc,realloc的和免費的。這甚至有可能嗎?

謝謝

+3

而不是複製內存,爲什麼不交換地址? – 2013-05-14 12:26:29

+0

我已經嘗試過,但我認爲這是不可能的void *數組...如果可能,你可以在這裏發佈一些代碼嗎? – Firzen 2013-05-14 12:28:20

+0

void是您的本地長度無符號整數。只需將其轉換或使用它作爲交換的指針算術。除非使用free(),否則不會丟失這些變量。或者,如果你使用智能指針,你會失敗嗎? – 2013-05-14 12:28:53

回答

2

爲什麼不以這種方式交換?:

void swap(void *v[], int i, int j) 
{ 
    void *temp; 

    temp = v[i]; 
    v[i] = v[j]; 
    v[j] = temp; 
} 

至於確實的qsort(數組中的元素交換):

void sort(void *v[], int left, int right, int (*comp)(const void *, const void *)) 
{ 
    int i, last; 

    if (left >= right) return; 
    swap(v, left, (left + right)/2); 
    last = left; 
    for (i = left + 1; i <= right; i++) { 
     if ((*comp)(v[i], v[left]) < 0) 
      swap(v, ++last, i); 
    } 
    swap(v, left, last); 
    sort(v, left, last - 1, comp); 
    sort(v, last + 1, right, comp); 
} 
+0

是的,就是這樣,非常感謝。我太過於堅持老師對free,malloc和realloc的說法。 – Firzen 2013-05-14 12:52:27

+0

不客氣:) – 2013-05-14 13:11:26

-1

數組內容可以是交換到位,僅使用char作爲臨時變量。

void swap(void *base, int len, int width) 
{ 
    int i; 
    char t; 

    for (i = 0; i < width; i++) 
    { 
    t = base[i]; 
    base[i] = base[i + width]; 
    base[i + width] = t; 
    } 
}