2011-05-29 40 views
2

我需要对指向数组的指针进行排序。实际上,我需要在地址之间进行搜索,以查看数组中是否存在给定结构的指针。不幸的是,在这些结构里面我没有什么“可比的”,所以我想按地址排序。 我的代码是这样的:qsort和bsearch指针数组

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作为返回值。

回答

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

(请不要投compare_functvoid*这并不做任何事情,除了关闭类型检查挑起未定义行为)

编辑:作为@R ..指出,除非ab指向一个共同的阵列,否则上述表现出未定义的行为。对于完全的可移植性(但是以牺牲即时可理解性为代价),您应该使用

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

这比仅关闭类型检查更糟糕:它是未定义的行为。不能安全地将一个函数指针转换为数据指针,反之亦然。想象一下,在一个哈佛架构机器上(单独的数据和程序总线),或者在小型(32位数据,16位函数指针)或中型存储器型号(16位数据和32位函数指针)中的旧DOS编译器上会发生什么。 – 2011-05-29 15:49:32

+0

虽然我们在这里,'b-a'也是未定义的行为,除非'b'和'a'碰巧指向一个公共数组。可移植版本是'memcmp(&a,&b,sizeof a);' - 比较指针逐字节的*表示而不是尝试去改变它们的区别。 – 2011-05-29 16:39:36

+0

你可以简化它只是'memcmp(p,q,sizeof(item *));' – 2011-05-29 16:41:06

0

here.

这一次把它描述得很好把它当做指针,而不是结构的指针烧焦的。

基本上这个想法是将struct cast转换为(void *),然后将其放回struct ** dereference以获取struct *,然后只进行比较。

使用qsort正确投射可能会非常棘手。