繁体   English   中英

什么是(void *)类型? 我该如何取消引用呢?

[英]What is the (void*) type? And how can I dereference it?

假设您有一个像下面这样的结构:

struct msgbuf {
 char msgtext[MAX_LENGTH];
}

然后将其转换为(void *)

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

  1. 什么是(void *)?与该结构有关的值是什么?

  2. 强制转换后如何获取m的msgtext的值? (我通过取消引用来假设)


编辑:详细说明而不发布太多的代码,我想将结构传递给我正在创建的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
}

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

尽管如果在函数声明中以这种方式明确声明结构,则可以按传递该结构,但它存在风险且不赞成使用。 当通过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);
   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM