有一个传入类型为void*的数组。我想对数组进行排序,但我需要能够创建一个临时值来切换数组的各个部分。我该怎么做呢?
因此,我使用memcpy在下面的代码中切换值:
memcpy(temp, first, size);
memcpy(first, cur, size);
memcpy(cur, temp, size);
在这里我尝试切换第一个和cur元素。(是的,它们是指针)。是这样的吗?因为我的程序出现了错误,尽管我不确定是不是因为这个。(错误如不准确的输出。)
发布于 2020-07-08 06:44:43
你的实现是可以的,但是关于你的comment,你的函数装饰应该是,像;
编辑:"l“替换为"byteLength”
void swap(void *a, void *b, size_t byteLength) {
void *tmp = malloc(byteLength);
memcpy(tmp, a, byteLength);
memcpy(a, b, byteLength);
memcpy(b, tmp, byteLength);
free(tmp);
return;
}
并且,如果您要交换字符串(即(char *)
指针);
void swap(void **a, void **b) {
void *tmp;
tmp = *a;
*a = *b;
*b = tmp;
return;
}
...
...
{
char *a = "some string";
char *b = "some other string";
...
...
// somewhere in the calling function
swap(&a, &b);
}
发布于 2020-07-08 06:54:21
它是泛型编程的核心。如果你想对一个void*
指针数组进行排序(每个指针可以指向任何数据类型,通常是它的用户定义的结构),你需要一个相等函数/函数指针。让我们假设我们有如下结构:
typedef struct
int foo;
....
....
}s_ex;
我们通过在堆上分配每个结构来初始化s_ex
结构的数组。
void* arr[];
我们希望将这个void*
指针数组传递给排序函数,可以对任何数据类型进行排序的泛型函数:
函数签名:
void gen_sort(void **user_array,int n, int(*fp_equality)(void*,void*));
唯一知道如何比较两个项的人是调用者(构建这些数据类型的人)!因此,他需要传递一个函数fp_equality,该函数知道如何比较两个项目并以int
(如strcmp
)的形式返回结果。
排序的算法不是问题,你可以决定哪种排序算法适合你的程序。为了简单起见,我采用冒泡排序:
void gen_sort(void **user_array,int n; int(*fp_equality)(void*,void*))
{
int i, j;
for (i = 0; i < n-1; i++)
// Last i elements are already in place
for (j = 0; j < n-i-1; j++)
if(fp_equality(arr[j],arr[j+1])>0) /*like: (arr[j] > arr[j+1])*/
swap(&arr[j], &arr[j+1]);
}
void swap(void** lhs, void** rhs)
{
void* temp = *lhs;
*lhs=*rhs;
*rhs=temp;
}
https://stackoverflow.com/questions/62787675
复制相似问题