【问题标题】:How to return an index from a bsearch or lfind? - sort distorts return vals如何从 bsearch 或 lfind 返回索引? - 排序扭曲返回值
【发布时间】:2014-07-15 16:21:53
【问题描述】:

我已经看过这个并尝试实现,但这样做总是给我一个段错误: 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,等等)。

【问题讨论】:

  • 您实际上是在将它除以 elemsz 变量的大小,我假设它是一个无符号整数(在 32 位机器上为 4 个字节)。你试过只除以cv->elemsz吗?
  • 将 sizeof(cv->elemsz) 更改为 elemsz 确实返回了正确的索引。但是,现在的问题是,如果使用 qsort 对向量进行排序,它会返回错误的值(预期为 20 时的索引为 10,等等)。
  • @AustinMullins 谢谢你,实际上,它照顾它!
  • 那么,排序问题也解决了吗?
  • 是的,基本上,在实践中,起始指针会减少向量的大小,所以为了得到实际的索引,我只需要将起始 int 值添加回索引并返回。

标签: c pointers pointer-arithmetic bsearch


【解决方案1】:

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

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

另外,你需要做类似的运算来利用返回的索引。

【讨论】:

    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2011-12-12
    相关资源
    最近更新 更多