Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何从B搜索或lfind返回索引?-排序使返回值失真_C_Pointers_Pointer Arithmetic_Bsearch - Fatal编程技术网

C 如何从B搜索或lfind返回索引?-排序使返回值失真

C 如何从B搜索或lfind返回索引?-排序使返回值失真,c,pointers,pointer-arithmetic,bsearch,C,Pointers,Pointer Arithmetic,Bsearch,我已经看过了,并尝试过实现,但这样做会不断给我一个seg错误: -这是供参考的链接 基本上,我试图从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); 根据上

我已经看过了,并尝试过实现,但这样做会不断给我一个seg错误: -这是供参考的链接

基本上,我试图从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*类型,然后减去与指针之间的距离,因为不能对void执行指针算术。我将其除以每个元素的大小以返回索引,该索引需要转换为int。这里缺少什么


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

问题是您将地址差除以elemsz属性的大小,该属性可能是32位无符号整数,换句话说,sizeof返回4,无论元素大小如何。只需除以cv->elemsz即可


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

实际上是将其除以elemsz变量的大小,我假设在32位机器上是一个4字节的无符号整数。你试过用cv->elemsz除法吗?将sizeofcv->elemsz更改为just elemsz确实返回了正确的索引。然而,现在的问题是,如果使用qsort对向量进行排序,那么当预期值为20时,它将返回错误的值索引10,等等@AustinMullins谢谢你,事实上,这已经解决了!所以,排序问题也消失了?是的,基本上,开始指针在实践中会削减向量大小,所以为了得到实际的索引,我只需将开始int值添加回索引并返回它。
index = *(int*)((char*)value_to_find - (char*)start_ptr)/cv->elemsz;