我已经看过这个并试图实现,但它一直给我一个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,等等)。
答案 0 :(得分:0)
问题在于你将地址差异除以elemsz
属性的大小,这可能是一个32位无符号整数(换句话说,sizeof
返回4,无论你的元素大小)。只需改为cv->elemsz
。
index = *(int*)((char*)value_to_find - (char*)start_ptr)/cv->elemsz;
此外,您需要执行类似的算法来使用返回的索引。