在C中使用qsort时出现警告

Mat*_*ips 5 c qsort

我写了比较函数

int cmp(const int * a,const int * b)
 {
   if (*a==*b)
   return 0;
else
  if (*a < *b)
    return -1;
else
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

我有我的声明

int cmp (const int * value1,const int * value2);
Run Code Online (Sandbox Code Playgroud)

我在我的程序中调用qsort就像这样

qsort(currentCases,round,sizeof(int),cmp);
Run Code Online (Sandbox Code Playgroud)

当我编译它时,我收到以下警告

warning: passing argument 4 of ‘qsort’ from incompatible pointer type
/usr/include/stdlib.h:710: note: expected ‘__compar_fn_t’ but argument is of type ‘int
(*)(const int *, const int *)’
Run Code Online (Sandbox Code Playgroud)

该程序工作正常,所以我唯一担心的是为什么它不喜欢我使用它的方式?

ken*_*ytm 19

cmp函数的原型必须是

int cmp(const void* a, const void* b);
Run Code Online (Sandbox Code Playgroud)

您可以在qsort的调用中强制转换它(不推荐):

qsort(currentCases, round, sizeof(int), (int(*)(const void*,const void*))cmp);
Run Code Online (Sandbox Code Playgroud)

或者将void指针强制转换为cmp中的int-pointers(标准方法):

int cmp(const void* pa, const void* pb) {
   int a = *(const int*)pa;
   int b = *(const int*)pb;
   ...
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,第一个是未定义的行为.无法保证您的实现的调用约定传递`const int*`与传递`const void*`的方式相同.在实践中,我希望它会好起来的.显然GCC也希望如此,因为它只是一个警告. (6认同)
  • 使用强制转换的方法是完全不可接受的,即使它似乎"有效". (2认同)
  • @AndreyT:你还有什么建议?写下你自己的快速排序?(注意,这是C,而不是C++,你不能使用`std :: sort`.) (2认同)