来自整数的指针在调用lfind时没有抛出警告

时间:2009-08-16 01:04:21

标签: c bsearch

我在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

但该程序仍在正常工作。

3 个答案:

答案 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函数中那样)是直接复制的值。

请确保传递大小的地址,一切都会好的。