x
• Status: Solved
• Priority: Medium
• Security: Public
• Views: 544

# casting with strcmp sort function

Demonstrations of qsort which sort an array alphabetically usually define a sort function like this:

int compare(const void* A, const void* B) {
return( strcmp(*((char **)A), *((char **)B) ) );
}

Why is there a need to cast to char**, and then derefence to get a char* ?  Why not just cast to char* ?

I tried:

int compare(const void* A, const void* B) {
return( strcmp((char *)A), (char *)B) ) );
}

This doesn't sort properly.  But I can't see the difference between the two functions.  Can someone explain why casting to char** and then dereferencing is functionally different than simply casting to char* ?
0
chsalvia
• 3
1 Solution

Commented:
Casting only means re-interpreting an address.

1) So, casting to char** means re-interpreting the address as a pointer to pointer to char. De-referencing after that means looking for the data the pointer is pointing to, and treating that as a char*

2) Just casting to char* means re-interpreting the address as a pointer to char.

These are very different - they don't even refer to the same memory !

An example :

int test = 5; /* value of test = 0x00000005 */
int *ptest = &test; /* value of ptest = the address of test, say 0x12345678 */
int **pptest = &ptest; /* value of pptest = the address of ptest, say 0x87654321 */

now :

1) cast to char** and de-reference :

char **ppc = (char**) pptest; /* value of ppc = 0x87654321 */
char *pc = *ppc; /* value of pc = 0x12345678 */
/* the 4 first memory bytes pc is pointing to contains 0x00000005 */

2) cast to char* :

char *pc = (char*) pptest; /* value of pc = 0x87654321 */
/* the 4 first memory bytes pc is pointing to contains 0x12345678 */
0

Commented:
It's easier if you make a drawing of the above example, showing the pointers etc.
0

Commented:
And about that compare function, you'd have to call it like this :

int compare(const void* A, const void* B) {
return( strcmp(*((char **)A), *((char **)B) ) );
}

char *strA = "stringA";
char *strB = "stringB";
compare(&strA, &strB);

Is that how it's done ?

If you want to use your compare function, you'd call it like this :

int compare(const void* A, const void* B) {
return( strcmp((char *)A, (char *)B ) );
}

char *strA = "stringA";
char *strB = "stringB";
compare(strA, strB);
0

Author Commented:
>> And about that compare function, you'd have to call it like this :

Well, I wouldn't call it directly.  It is just meant to be passed to qsort.  I found the function in a qsort tutorial, in fact.

But I understand what you're saying about the different pointer locations.  Thank you.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.