什么是(void *)类型?我怎样才能取消引用它?

时间:2015-03-31 03:00:21

标签: c pointers

假设你有一个如下所示的结构:

struct msgbuf {
 char msgtext[MAX_LENGTH];
}

然后你把它投到(void *)

struct msgbuf m;
m.msgtext = "Text";
(void*) m;

  1. 什么是(void *),它包含哪些与结构有关的值?

  2. 如何在演员表后获取m的msgtext值? (我通过解除引用来假设)


  3. 编辑:要详细说明而不发布太多代码,我想将结构传递给我正在创建的POSIX线程。

    th_ret = pthread_create( &thread1, NULL, method_called, (void*) m);
    
    void *method_called( void *rsp)
    {
    //get text from *rsp, which should be m passed
    }
    

1 个答案:

答案 0 :(得分:4)

您希望将&m传递给pthread_create()(例如,通过引用传递结构)。 &m是您的结构的地址,地址与void *兼容。

虽然结构可以通过 value 传递,如果在函数声明中以这种方式明确声明,那么它是冒险的并且不赞成。当通过void *参数发送时,结构必须通过引用传递,原因很明显 - 结构不能通常包含在sizeof(void *)中金额记忆。

pthread_create()使用void *参数类型尽可能通用,例如适应各种固定长度类型,可以适应数量的堆栈空间,通过将指针传递给它们来间接间接引用大量数据

其中函数参数是void *,并且定义了struct:

 struct {
   .
   .
   .
 } myStruct;

这是合法的:

 (void *)&myStruct  // pass by reference

这是非法的(编译器不允许):

 (void *)myStruct  // pass by value

有时人们会将简单的intunsigned int传递给他们的线程,因为它更简单,并且足以满足他们的需要,但通常会传递指向struct的指针。提及传达任意数量的上下文相关数据。

int(以及其他几种数据类型)可以转换为void *,反之亦然,例如,如果您只想传递整数或浮点数。重要的是你如何通过论证与你以后如何解释它是一致的。

通话:

   struct msgbuf {
       char msgtext[MAX_LENGTH];
   } m;
   th_ret = pthread_create( &thread1, NULL, method_called, &m);

处理:

   void *method_called(void *rsp) {
       struct msgbuf *m = rsp;
       printf("%s\n", m->msgtext);
   }