C - 泛型函数:交换数组中的两个项目

时间:2016-06-20 22:02:07

标签: c arrays pointers function-pointers generic-programming

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

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

我很确定我搞砸了指针,但仍无法找到解决方案。我将不胜感激任何帮助:)。

1 个答案:

答案 0 :(得分:1)

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

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

缩放指针计算@EOF

也释放分配的内存。

我希望通过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个字节可能会返回NULL会出现内存不足。 OTOH,size == 0是最不寻常的。