【问题标题】:C - generic function: swap two items in arrayC - 通用函数:交换数组中的两项
【发布时间】:2016-06-20 22:02:07
【问题描述】:

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

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

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

【问题讨论】:

  • 注意:复制完成后,好free(temp);
  • 使用简单宏有什么问题?您的代码是编程错误的邀请,并且会非常缓慢地为每个交换分配/释放内存
  • 如果你想交换同一个数组中的两个条目,为什么不使用第一个函数呢? SwapG(&array[idx1], &array[idx2], sizeof(entry))
  • @EOF 您的代码将交换指针的地址,而不是指针指向的数据。
  • @JoelTrauger:不会。调用会将指向对象的指针传递SwapG()-函数,该函数在这些指针上使用memcpy()

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


【解决方案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 是最不寻常的。

【讨论】:

  • @chox 非常感谢,对不起,如果这个问题很愚蠢,我只是在学习 C
猜你喜欢
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多