2

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

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

4

2 回答 2

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 *));
}
于 2011-05-29T10:47:48.587 回答
0

这里。

这个描述它很好地将其视为指向结构的指针而不是指向字符的指针。

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

使用 qsort 正确地进行演员阵容可能会很棘手。

于 2011-05-29T10:17:13.633 回答