2013-05-14 40 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; 
    } 
}