使用void指针交换数组中的元素

时间:2012-10-10 14:21:13

标签: c function types

我需要写一个函数

void reverse(void *base, int nel, int width) 
{ 
    // ... 
}

其中base是指向数组开头的指针,nel - 数组中元素的数量,width是每个元素的大小(以字节为单位)。

例如,我如何交换数组的前两个元素?

2 个答案:

答案 0 :(得分:2)

memcpy值的帮助下,您可以简单地使用width(因为它是内置于许多编译器上的)。您还需要一个临时变量。

/* C99 (use `malloc` rather than VLAs in C89) */
#include <string.h>

void reverse(void *base, size_t nel, size_t width) 
{
    if (nel >= 2) {
        char *el1 = base;
        char *el2 = (char *)base + width;
        char tmp[width];

        memcpy(tmp, el1, width);
        memcpy(el1, el2, width);
        memcpy(el2, tmp, width);
    }
}

答案 1 :(得分:2)

如果您想要输入通用类型,请使用

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

这将交换前两个元素。