我正在尝试在C中对任意类型的数组进行排序。我正在使用指向空洞和memcpy的指针。但是,我一直在收到错误,说“无效使用无效表达式”#39;与memcopy函数相关联,并且'无效解除引用void指针'。我知道有很多关于这个错误的其他线程,但阅读这些线程并没有帮助我解决这个问题。我的代码如下:
#include "mysort.h"
#include <alloca.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
void mysort(int n, int elementSize, void * array, int ascending,CompareFunction compFunc)
{
//bubblesort algorithm
if (ascending == 1)
{ int c,d;
void * swap = malloc(elementSize);
void * thing1 = malloc(elementSize);
void * thing2 = malloc(elementSize);
for (c = 0; c < (n - 1); c++)
{
for (d = 0; d < n - c - 1; d++)
{
memcpy(thing1, array[d], elementSize);
memcpy(thing2, array[d+1], elementSize);
if ( compFunc(thing1,thing2) >= 0)
{
memcpy(swap, array[d], elementSize);
array[d] = array[d+1];
array[d+1]= swap;
}
}
}
}
if (ascending != 1)
{ int c,d;
void * swap = malloc(elementSize);
void * thing1 = malloc(elementSize);
void * thing2 = malloc(elementSize);
for (c = 0; c < (n - 1); c++)
{
for (d = 0; d < n - c - 1; d++)
{
memcpy(thing1, array[d], elementSize);
memcpy(thing2, array[d+1], elementSize);
if ( compFunc(thing1,thing2) <= 0)
{
memcpy(swap, array[d], elementSize);
array[d] = array[d+1];
array[d+1]= swap;
}
}
}
}
}
非常感谢任何建议。
答案 0 :(得分:2)
您不能像使用已知类型的数组那样在void *
上使用数组下标运算符。你需要转换为char *
并自己做指针算法。
此外,您不需要thing1
和thing2
。只需直接在要比较的元素上调用compFunc
即可。
所以改变这个:
memcpy(thing1, array[d], elementSize);
memcpy(thing2, array[d+1], elementSize);
if ( compFunc(thing1,thing2) >= 0)
{
memcpy(swap, array[d], elementSize);
array[d] = array[d+1];
array[d+1]= swap;
}
对此:
void *current = (char *)array + (elementSize * d);
void *next = (char *)array + (elementSize * (d + 1));
if ( compFunc(current, next) >= 0)
{
memcpy(swap, current, elementSize);
memcpy(current, next, elementSize);
memcpy(next, swap, elementSize);
}
同样在另一种情况下。
答案 1 :(得分:1)
正如评论中所述,编译器抱怨array[d]
和array[d + 1]
。参数array
是void *
,因此如果这些表达式有效,那么他们将指定void
类型的对象,这些对象不可存在。
memcpy()
。相反,您希望将指针传递给它们。表达这些的最好方法可能是通过指针算法。例如:
memcpy(thing1, ((char *) array) + (d * elementSize), elementSize);