[英]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;
什么是(void *)?与该结构有关的值是什么?
强制转换后如何获取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
有时人们将简单的int
或unsigned 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.