我在C中写了一个向量。如果它被排序,则CVectorSearch函数使用bsearch,如果它未被排序则使用lfind。当我调用lfind时,为什么我收到警告“赋值从整数中生成指针而没有强制转换”?即使使用lfind,它似乎也能正常工作。
typedef struct
{
void *elements;
int logicalLength;
int allocatedLength;
int elementSize;
} CVector;
typedef void (*CVectorFreeElemFn)(void *elemAddr);
int CVectorSearch(const CVector *v, const void *key,
CVectorCmpElemFn comparefn,
int startIndex, bool isSorted)
{
void * found;
int elemSize = v->elementSize;
int length = v->logicalLength;
void *startAddress = (char*)v->elements + startIndex*elemSize;
if(isSorted)
found = bsearch(key, startAddress, length, elemSize, comparefn);
else
found = lfind(key, startAddress, &length, elemSize, comparefn);
if(found)
return ((char*)found - (char*)v->elements) / elemSize;
else
return -1;
}
编辑现在我已经包含了search.h,我得到了:
warning: passing argument 3 of 'lfind' from incompatible pointer type
但该程序仍在正常工作。
答案 0 :(得分:4)
您是否包含定义<search.h>
的{{1}}?如果在没有原型的情况下调用函数,则编译器可能会假定它返回lfind
。
答案 1 :(得分:1)
lfind()的第三个参数是指向size_t
而不是int
的指针。在某些体系结构(特别是x86-64)上,size_t
类型的大小可能与int
不同,并且它也是无符号的。您必须更改length
变量的类型。
答案 2 :(得分:0)
我不认为上述问题确实可以解决问题,因为我遇到了这个问题。我认为真正的答案是bsearch原型和lfind原型之间的区别。我们来看看
void *bsearch(const void *key, const void *base, size_t nmemb,
size_t size, int (*compar)(const void *, const void *));
Versus
void *lfind(const void *key, const void *base, size_t *nmemb,
size_t size, int(*compar)(const void *, const void *));
如果您注意到lfind函数的第三个参数是指向size_t类型的指针(不像在bsearch函数中那样)是直接复制的值。
请确保传递大小的地址,一切都会好的。