Suppose I have an array of pointers to char in C:
char *data[5] = { "boda", "cydo", "washington", "dc", "obama" };
And I wish to sort this array using qsort:
qsort(data, 5, sizeof(char *), compare_function);
I am unable to come up with the compare function. For some reason this doesn’t work:
int compare_function(const void *name1, const void *name2)
{
const char *name1_ = (const char *)name1;
const char *name2_ = (const char *)name2;
return strcmp(name1_, name2_);
}
I did a lot of searching and found that I had to use ** inside of qsort:
int compare_function(const void *name1, const void *name2)
{
const char *name1_ = *(const char **)name1;
const char *name2_ = *(const char **)name2;
return strcmp(name1_, name2_);
}
And this works.
Can anyone explain the use of *(const char **)name1 in this function? I don’t understand it at all. Why the double pointer? Why didn’t my original function work?
Thanks, Boda Cydo.
If it helps keep things straight in your head, the type that you should cast the pointers to in your comparator is the same as the original type of the data pointer you pass into
qsort(that the qsort docs callbase). But forqsortto be generic, it just handles everything asvoid*, regardless of what it “really” is.So, if you’re sorting an array of ints, then you will pass in an
int*(converted tovoid*). qsort will give you back twovoid*pointers to the comparator, which you convert toint*, and dereference to get theintvalues that you actually compare.Now replace
intwithchar*:if you’re sorting an array of
char*, then you will pass in achar**(converted tovoid*). qsort will give you back twovoid*pointers to the comparator, which you convert tochar**, and dereference to get thechar*values you actually compare.In your example, because you’re using an array, the
char**that you pass in is the result of the array ofchar*“decaying” to a pointer to its first element. Since the first element is achar*, a pointer to it is achar**.