Improve company productivity with a Business Account.Sign Up

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

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
Asked:
chsalvia
  • 3
1 Solution
 
Infinity08Commented:
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
 
Infinity08Commented:
It's easier if you make a drawing of the above example, showing the pointers etc.
0
 
Infinity08Commented:
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
 
chsalviaAuthor 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.

Join & Write a Comment

Featured Post

Creating Active Directory Users from a Text File

If your organization has a need to mass-create AD user accounts, watch this video to see how its done without the need for scripting or other unnecessary complexities.

  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now