如何检查void*指针是否可以安全地转换为其他内容?

App*_*ker 4 c pointers casting void void-pointers

假设我有这个函数,它是一些gui工具包的一部分:

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* */
Run Code Online (Sandbox Code Playgroud)

由于paint_handler也将由GUI工具包的主循环​​与其他参数一起调用,因此我不能总是确定我接收的参数将始终是指针s.

我可以IS_MY_STRUCTpaint_handler函数中执行某些操作来检查我收到的参数是否可以安全地返回到My_Struct*

Ton*_*ion 18

你的void指针丢失了它的所有类型信息,所以单凭它,你无法检查它是否可以安全地转换.由程序员决定是否void*可以安全地转换为类型.