qsort和bsearch指针数组

时间:2011-05-29 10:05:51

标签: c libc qsort bsearch

我需要对struc的指针数组进行排序。实际上,我需要在地址中进行搜索,以查看数组中是否存在指向结构的指定指针。不幸的是,我在这些结构中没有任何“可比性”的东西,所以我只想按地址排序。 我的代码是这样的:

item* arr[SIZE];
//something is inserted
qsort(arr, SIZE, sizeof(item*), (void*)compare_funct); 
//CUT
bsearch(curr, arr, SIZE, sizeof(item*), (void*)compare_funct);

我尝试创建一个compare_funct,只是将指针转换为int并返回它们的区别,但它似乎不起作用。特别是,当我进行bsearch时,即使我知道元素包含在数组中,我总是得到一个NULL作为返回值。

2 个答案:

答案 0 :(得分:5)

int cmp_items(void const *p, void const *q)
{
    item const *a = *(item const **)p, *b = *(item const **)q;
    return b - a;
}

(请不要将compare_funct强制转换为void*。除了关闭类型检查引发未定义的行为之外,这不会做任何事情。)

编辑:正如@R ..指出的那样,除非ab指向公共数组,否则上述行为会显示未定义的行为。为了完全可移植性(但以牺牲立即可理解性为代价),您应该使用

int compare_pointers(void const *p, void const *q)
{
    return memcmp(p, q, sizeof(item *));
}

答案 1 :(得分:0)

here.

这个描述很好地将它想象为struct而不是指向char的指针。

基本上我的想法是将struct **传递给(void *),然后将它放回struct ** dereference以获取struct *,然后进行比较。

使用qsort获得正确的演员阵容可能很棘手。