Typecasting结构指向字符指针

时间:2016-09-03 07:04:55

标签: c

我的结构定义为

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的值作为连接类型。 这个怎么运作? 感谢

1 个答案:

答案 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; 等...