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
是最不寻常的。
我的问题:我想创建可以交换泛型数组中任意两项的函数。
我有 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
是最不寻常的。