【问题标题】:pointer from integer w/o cast warning when calling lfind调用 lfind 时来自整数的指针,不带强制转换警告
【发布时间】:2010-11-19 23:22:42
【问题描述】:

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

不过,该程序仍在正常运行。

【问题讨论】:

    标签: c bsearch


    【解决方案1】:

    您是否包含了定义lfind<search.h>?如果在没有原型的情况下调用函数,您的编译器可能会假定它返回 int

    【讨论】:

      【解决方案2】:

      lfind() 的第三个参数是指向 size_t 而不是 int 的指针。在某些架构(尤其是 x86-64)上,size_t 类型的大小可能与 int 不同,并且它也是无符号的。您必须更改length 变量的类型。

      【讨论】:

        【解决方案3】:

        我认为上述问题并不能真正解决问题,因为我遇到了这个问题。我认为真正的答案是 bsearch 原型和 lfind 原型之间的区别。一起来看看

         void *bsearch(const void *key, const void *base, size_t nmemb,
                      size_t size, int (*compar)(const void *, const void *));
        

        对比

        void *lfind(const void *key, const void *base, size_t *nmemb,
                      size_t size, int(*compar)(const void *, const void *));
        

        如果您注意到 lfind 函数的第三个参数是指向 size_t 类型的指针,而不是(如在 bsearch 函数中)直接复制的值。

        只要确保你传入大小的地址就可以了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-19
          • 2019-02-10
          • 1970-01-01
          相关资源
          最近更新 更多