bsearch返回NULL但元素在数组中

#define u32 uint32_t #define Narray 10 struct edge { u32 v1; u32 v2; }; int struct_cmp_by_v1(const void *i, const void *j) { struct edge *a = (struct edge *)i; struct edge *b = (struct edge *)j; u32 x = a->v1; u32 y = b->v1; return x > y ? 1 : -1; } struct edge *array = malloc((sizeof(struct edge))*Narray); struct edge *l = malloc(sizeof(struct edge)); struct edge *e = (struct edge *) bsearch(l, array, Narray, sizeof(struct edge), struct_cmp_by_v1); 

数组很小,有大数字u32,但我只根据结构边缘的一个字段查找一个元素,即v1,然后只在v1之间进行比较。

bsearch使用的键是struct edge * l,其中l-> v1包含要搜索的元素。

结构边缘的数组,有元素v1要查找但是bserach找不到并返回NULL,我没有看到我提交的错误

注意:该数组仅包含10个要测试的元素,但它可以是一个包含25056012个元素的非常大的数组,甚至更多

return x > y ? 1 : -1; 永远不会返回0(匹配)。 尝试return (int)(x - y); (只是注意到无符号类型,所以需要注意这一点 – 我使用了一个简单的转换,但可能有更安全的方式)

评论re:溢出是正确的(但在正常使用中不太可能),如果on是一个巨大的积极而另一个是一个巨大的负面,那么你将遇到问题。

一个很好的清晰方法来处理任何大小而没有溢出或签名问题:

 if (x == y) return 0; return x > y ? 1 : -1; 

谢谢你的答案,他们帮我找到了解决方案。 我仍然没有为大型arrays探测它。 无论如何,比较function是:

 int struct_cmp_by_v2(const void *i, const void *j) { struct edge *a = (struct edge *)i; struct edge *b = (struct edge *)j; u32 x = a->v1; u32 y = b->v1; if (x == y) return 0; else { if (x > y) return 1; else return -1; } }