bsearch devuelve NULL pero el elemento está en la matriz

#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); 

La matriz es pequeña con grandes números u32, pero solo busco un elemento según un campo de la estructura, que es v1, luego la comparación solo se hace entre v1.

La clave utilizada por bsearch es, struct edge * l, donde l-> v1 contiene el elemento a buscar.

El, array de struct edge, tiene que encontrar el elemento v1 pero bserach no lo encuentra y devuelve NULL, no veo el error que estoy cometiendo

Nota: la matriz contiene solo 10 elementos para probar, pero puede ser una matriz muy grande con 25056012 elementos, incluso más

return x > y ? 1 : -1; Nunca devuelve 0 (un partido). Intente return (int)(x - y); (Solo he señalado los tipos sin firma, así que debes estar consciente de eso. He utilizado un modelo simple, pero es probable que haya una forma más segura)

Comentario: el desbordamiento es correcto (pero es poco probable en el uso normal), si es un gran positivo y el otro es un gran negativo, entonces tendrá problemas.

Una buena forma clara de manejar cualquier tamaño sin problemas de desbordamiento o de firma:

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

Gracias por las respuestas, me ayudaron a encontrar la solución. Todavía no lo pruebo para una gran matriz. De todos modos, la función de comparación es:

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