C - 通用函数:交换数组中的两个项目

C - generic function: swap two items in array

我的问题:我想创建可以交换泛型数组中任意两项的函数。

我有 SwapG 功能,可以交换任何类型的两个项目:

void SwapG(void * a, void * b, size_t size)
{
    void * temp = malloc(size);
    memcpy(temp, a, size);
    memcpy(a, b, size);
    memcpy(b, temp, size);
}

这是我尝试的函数,可以交换任何类型数组中的两个项目:

void SwapInArrayG(void ** arr, int a, int b, size_t size)
{
    void * temp = malloc(size);
    memcpy(temp, *(arr + a), size);
    memcpy(*(arr + a), *(arr + b), size);
    memcpy(*(arr + b), temp, size);
}

我很确定我搞砸了指针,但我仍然找不到解决方案。我将不胜感激 :).

添加到 void * 未定义。转换为 char *.

可能需要取消引用 arr,但我认为应该调整 OP 的签名。参见

缩放指针计算

也释放分配的内存。


我希望通过 void * 就足够了。

void SwapInArrayG(void * arr, int a, int b, size_t size) {
    void * temp = malloc(size);
    if (size > 0) {
      assert(temp);
      assert(a >= 0 && b >= 0);
      memcpy(temp, (char *)arr + size*a, size);
      memcpy((char *)arr + size*a, (char *)arr + size*b, size);
      memcpy((char *)arr + size*b, temp, size);
    }
    free(temp);  
}

不清楚OP是如何调用这个函数的,但下面是典型的。

foo_type G[some_size];
SwapInArrayG(G, index_a, index_b, sizeof *G);

注意:根据编码目标,使用类型 size_t 的索引通常优于类型 int.

注意:assert(temp);if (size > 0) 之内,因为分配 0 个字节可能 return NULL 不是 内存。 OTOH,size == 0 是最不寻常的。