Warning when using qsort in C

Matt Phillips picture Matt Phillips · Apr 1, 2010 · Viewed 13.3k times · Source

I wrote my comparison function

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

and i have my declaration

int cmp (const int * value1,const int * value2);

and I'm calling qsort in my program like so

qsort(currentCases,round,sizeof(int),cmp);

when i compile it I get the following warning

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 *)’

The program works just fine so my only concern is why it doesn't like the way im using that?

Answer

kennytm picture kennytm · Apr 1, 2010

The cmp function's prototype must be

int cmp(const void* a, const void* b);

You can either cast it in the invocation of qsort (not recommended):

qsort(currentCases, round, sizeof(int), (int(*)(const void*,const void*))cmp);

or casts the void-pointers to int-pointers in cmp (the standard approach):

int cmp(const void* pa, const void* pb) {
   int a = *(const int*)pa;
   int b = *(const int*)pb;
   ...