gpt4 book ai didi

c - lfind 给出不一致的结果

转载 作者:行者123 更新时间:2023-11-30 19:42:07 25 4
gpt4 key购买 nike

我正在尝试使用结构体的第一个元素作为键来搜索大量结构体。由于数组已排序,因此 bsearch 很好并且适合我。然后我尝试使用 lfind 来仔细检查结果,但它给了我一些奇怪的输出。代码如下,正确的输出应该是全部命中,因为键与数组中的第二个元素匹配。 bsearch 产生了正确的结果,但 lfind 给出了一些命中和未命中的结果。如果未命中,lfind 似乎甚至没有调用我的比较函数,这表明 lfind 内部发生了某种错误。我尝试使用 lldb 进入 lfind 但它显示了我无法理解的汇编代码。如果我在调用 lfind 之前重置 void *hit = NULL ,它似乎可以解决问题。但为什么?机器是 MAC OS X Yosemite。

typedef struct SKU{
char *sku;
char *desc;
} SKU;

int SKUcmp(const void *, const void *);
int find_desc(const void *, const void *);

int main(int argc, char **argv){
SKU skus[] = {
{"", "080686002123"},
{"000020", "Oyster Bay Pinot Gris"},
{"000122", "Woodstock Honey 12X250ml Cans"},
{"000238", "Entertainers Cocktail Set"},
{"000987", "Hennessy VSOP 750ml"},
{"000988", "V Drink 355ML Cans"},
{"000989", "Dark Horse 7% 4x6x250ML Cans"}
};

SKU dummy = {"000122", ""};
void *hit;
printf("binary search ... ");
hit = bsearch(&dummy, skus, 7, sizeof(SKU), &find_desc);
if(hit) printf("HIT\n");
else printf("MISS\n");

// hit = NULL; // seemed to solve the problem
int x = 7;
printf("linear search ... ");
hit = lfind(&dummy, skus, (size_t *)&x, sizeof(SKU), &find_desc);
if(hit) printf("HIT\n");
else printf("MISS\n");
}

int find_desc(const void *key, const void *s){
//printf("entering compare func ...\n");
char *temp2 = ((SKU *)s)->sku;
char *temp1 = ((SKU *)key)->sku;

int result = strcmp(((SKU *)key)->sku, ((SKU *)s)->sku);

return result;
}

运行 x10 会产生以下输出:

binary search ... HIT
linear search ... MISS
binary search ... HIT
linear search ... HIT
binary search ... HIT
linear search ... MISS
binary search ... HIT
linear search ... MISS
binary search ... HIT
linear search ... HIT
binary search ... HIT
linear search ... MISS
binary search ... HIT
linear search ... HIT
binary search ... HIT
linear search ... HIT
binary search ... HIT
linear search ... HIT
binary search ... HIT
linear search ... MISS

最佳答案

在 OS X 上 sizeof(int) == 4sizeof(size_t) == 8。将 (int*) 转换为 (size_t*) 是一个错误。

可能设置hit = NULL会清除堆栈上的字节,这些字节在转换(size_t*)后也用作数组大小。因此,它改变了应用程序的行为。

但是,x 的类型应该是 size_t:

size_t x = 7;

关于c - lfind 给出不一致的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32782475/

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