bsearch返回NULL但元素在数组中

时间:2018-04-04 23:30:51

标签: c

#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个元素的非常大的数组,甚至更多

2 个答案:

答案 0 :(得分:1)

quantity_sold永远不会返回0(匹配)。试试return x > y ? 1 : -1;(只需注意未签名的类型,所以需要注意这一点 - 我使用了简单的演员,但可能有更安全的方式)

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

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

return (int)(x - y);

答案 1 :(得分:0)

感谢您的回答,他们帮助我找到了解决方案。 我仍然没有探测大型阵列。 无论如何,比较功能是:

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;
  }
}