如何从搜索中返回索引或查找? - sort会扭曲返回值

时间:2014-07-15 16:21:54

标签: c pointers pointer-arithmetic bsearch

我已经看过这个并试图实现,但它一直给我一个seg错误这样做: Determining index from bsearch and lfind? - 这是供参考的链接。

基本上,我试图从bsearch或lfind返回的指针中找出数组中的索引。

void *val;
void *begin = (char *)v->elems (I need to use this separate variable)

然后,我打电话给任何搜索,这似乎工作得很好......

val = bsearch(key, begin, v->count, v->elemsz, cmp);

根据上面的链接,我尝试执行以下操作:

index = *(int*)((char*)value_to_find - (char*)start_ptr)/sizeof(cv->elemsz)

然而,每次我这样做都会出现段错误。我的逻辑是我将两个void指针都转换为char *类型,然后减去指针的距离b / w,因为你无法对void进行指针运算。我将此除以每个元素的大小以返回索引,该索引需要转换为int。我在这里缺少什么?

编辑:将sizeof(cv-> elemsz)更改为elemsz确实返回了正确的索引。但是,现在的问题是,如果使用qsort对向量进行排序,则返回错误的值(当预期为20时索引为10,等等)。

1 个答案:

答案 0 :(得分:0)

问题在于你将地址差异除以elemsz属性的大小,这可能是一个32位无符号整数(换句话说,sizeof返回4,无论你的元素大小)。只需改为cv->elemsz

index = *(int*)((char*)value_to_find - (char*)start_ptr)/cv->elemsz;

此外,您需要执行类似的算法来使用返回的索引。