我的结构定义为
typedef struct Check
{
char conn_type;
int fd;
}Check;
Check *msg;
//malloc code not writing.Consider it as malloced.
msg->con_type = 1;
msg->fd = listen_fd = 10;
add_select_msg_com_con((char*)msg);
我在代码中找到了某个地方,他们将其类型化为(char *)Check
例如 -
add_select((字符*)MSG)
在其定义中
void add_select(char* data_ptr)
{
struct epoll_event pfd
pfd.data.ptr = (void *) data_ptr;
}
我想知道,pfd.data.ptr中的ptr是无效指针,它将如何获取ptr的值作为连接类型。 这个怎么运作? 感谢
答案 0 :(得分:2)
好的,让我们正确定义一个结构(你的是匿名的,但我认为这是一个错字):
typedef struct
{
char conn_type;
int fd;
} Check;
现在在发件人的代码中我定义了&初始化名为Check
的{{1}}类型的变量。
msg
我想使用不知道Check msg = {'a',12};
的库发送包含msg
内容的事件。我在Check
上创建了一个指针并引用了char
msg
然后我打电话给
char *pmsg = (char*)&msg;
他们转换为add_select(pmsg);
所以它适合char *
的原型(它不会改变指针的值,但它是类型,所以编译器接受它)
在add_select
中,它再次被转换为add_select
(这是不必要的,因为void *
是通用指针类型),它是在框架内的消息中传递用户数据的通用指针不知道您的void *
结构(Check
结构有一个“用户数据”epoll_event
指针,用于将任何信息传递给事件监听器)
我宁愿像这样定义void *
:
add_select
所以我可以直接用void add_select(void* data_ptr)
{
struct epoll_event pfd;
pfd.data.ptr = data_ptr;
}
变量调用它,不需要强制转换:
msg
现在在消息接收方
获取消息的程序(事件侦听器)(在传输的另一端)必须知道匿名字节流消息隐藏了add_select(&msg);
结构以执行反向转换:
Check
所以它可以访问// convert/map the anonymous data to a `Check` structure
Check *recieved_msg = (Check *)pfd.data.ptr;
等...