Prog_
asked on
reinterpret_cast
I was wondering why this casting does'nt work ...
Is there an other way to cast this... in C++
I know that it's working with
char ** p1 = (char **) elem1; but this is C casting...
Help me
int compare(const void* elem1, const void* elem2)
{
const char **p1 = reinterpret_cast< const char**>(elem1);
...
Is there an other way to cast this... in C++
I know that it's working with
char ** p1 = (char **) elem1; but this is C casting...
Help me
int compare(const void* elem1, const void* elem2)
{
const char **p1 = reinterpret_cast< const char**>(elem1);
...
static_cast should work in almost any case. Not completly sure whether the const specifier doesn't allow for reinterpret_cast. If so you can remove the const'ness with const_cast.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
By trying the cast from <const void *> to <const char **> you are trying to cast away the constness since it is the value pointed to be the first dereference of elem1 that is const. Instead you should be casting to <char * const *>. Also you should probably use static_cast, since the semantics of this cast are more well defined and guaranteed to be portable (although in this case reinterpret_cast is probably equivalent).
const char * const *p1 = static_cast< char * const * >(elem1);
Try that.
const char * const *p1 = static_cast< char * const * >(elem1);
Try that.
reinterpret_cast - internally interpret the pointers ( source pointer and target pointer ) and while compile time it embeds extra code if neccessary.
Here your treatment on pointers is converting from void* to char **. Which are not compatable
You are trying to copy only the 4 bytes of pointer data ( ex. 0x023FD2F) to the target pointer.
const char **p1 = reinterpret_cast< const char**>(elem1); - this casting should not be used here
reinterpret_cast is used when some situations like virtual pointer hirerchy casting
For only pointer copy it is not neccessary an extra interpretation is neccessary by the compiler then this casting is supportable
void* is a strange beast. It is a pointer to something unspecified. There is nothing wrong with saying that the unspecified thing is a char**, in fact we'd be lost if we weren't able to typecast void* in thread code.
You can do the following with a static_cast per the standard. I was surprised that the standard does not guarantee reinterpret_cast to work for void* too, but it does indeed say that it is implementation specific. Neither static nor reinterpret casts cast off constness though.
---------8<--------
#include <cstdio>
#include <memory>
int main()
{
// malloc() - more comfortable in C code, but
// what the hell. It is a simple example of
// something that returns a void*, when you
// really mean it to return a pointer to something
// different
void *ptr = malloc(sizeof(char*) * 2);
// However, we were allocating an array of 2 char* s
char **arr = static_cast<char**>(ptr);
// Just to show it works
arr[0] = "one";
arr[1] = "two";
for (int i = 0;i < 2;i++)
printf("String %d is \"%s\"\n",i+1,arr[i]);
free(ptr);
}
---------8<--------
NB: it looks odd written like this, because you are more used to seeing a C cast in C-ish C++.
char** arr = (char**)malloc(sizeof(char *) * 2);
You can do the following with a static_cast per the standard. I was surprised that the standard does not guarantee reinterpret_cast to work for void* too, but it does indeed say that it is implementation specific. Neither static nor reinterpret casts cast off constness though.
---------8<--------
#include <cstdio>
#include <memory>
int main()
{
// malloc() - more comfortable in C code, but
// what the hell. It is a simple example of
// something that returns a void*, when you
// really mean it to return a pointer to something
// different
void *ptr = malloc(sizeof(char*) * 2);
// However, we were allocating an array of 2 char* s
char **arr = static_cast<char**>(ptr);
// Just to show it works
arr[0] = "one";
arr[1] = "two";
for (int i = 0;i < 2;i++)
printf("String %d is \"%s\"\n",i+1,arr[i]);
free(ptr);
}
---------8<--------
NB: it looks odd written like this, because you are more used to seeing a C cast in C-ish C++.
char** arr = (char**)malloc(sizeof(char