gpt4 book ai didi

c - 如何从 bsearch 或 lfind 返回索引? - 排序会扭曲返回值

转载 作者:行者123 更新时间:2023-11-30 17:31:09 32 4
gpt4 key购买 nike

我已经看过这个并尝试实现,但它总是给我一个段错误来这样做: 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* 类型,然后减去指针之间的距离,因为不能对 void 进行指针算术。我将其除以每个元素的大小以返回索引,该索引需要转换为 int。我在这里缺少什么?

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

最佳答案

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

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

此外,您需要执行类似的算术才能利用返回的索引。

关于c - 如何从 bsearch 或 lfind 返回索引? - 排序会扭曲返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24763330/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com