我的问题:我想创建一个可以交换泛型类型数组中任意两项的函数。
我有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);
}
我很确定我搞砸了指针,但仍无法找到解决方案。我将不胜感激任何帮助:)。
答案 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
是最不寻常的。