Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check if a void* pointer can be safely cast to something else?

Let's say I have this function, which is part of some gui toolkit:

typedef struct _My_Struct My_Struct;
/* struct ... */

void paint_handler( void* data )
{
   if ( IS_MY_STRUCT(data) ) /* <-- can I do something like this? */
   {
      My_Struct* str = (My_Struct*) data;
   }
}

/* in main() */
My_Struct s;
signal_connect( SIGNAL_PAINT, &paint_handler, (void*) &s ); /* sent s as a void* */

Since the paint_handler will also be called by the GUI toolkit's main loop with other arguments, I cannot always be sure that the parameter I am receiving will always be a pointer to s.

Can I do something like IS_MY_STRUCT in the paint_handler function to check that the parameter I am receiving can be safely cast back to My_Struct* ?

like image 516
ApprenticeHacker Avatar asked Feb 01 '12 16:02

ApprenticeHacker


People also ask

Can you cast a void pointer?

A void pointer is a pointer that has no associated data type with it. A void pointer can hold address of any type and can be typecasted to any type.

Can void pointers point to anything?

A void pointer is a pointer that can point to any type of object, but does not know what type of object it points to. A void pointer must be explicitly cast into another type of pointer to perform indirection. A null pointer is a pointer that does not point to an address. A void pointer can be a null pointer.

Can I cast a void * to an int?

Any expression can be cast to type void (which means that the result of the expression is ignored), but it's not legal to cast an expression of type void to type int — not least because the result of such a cast wouldn't make any sense.

What is the limitation of void pointer?

The only limitations with void pointers are: you cannot dereference void pointer for obvious reasons. sizeof(void) is illegal. you cannot perform pointer arithmetics on void pointers.


1 Answers

Your void pointer looses all its type information, so by that alone, you cannot check if it can be cast safely. It's up to the programmer to know if a void* can be cast safely to a type.

like image 94
Tony The Lion Avatar answered Oct 11 '22 12:10

Tony The Lion