假设你有一个如下所示的结构:
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
}
答案 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
有时人们会将简单的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);
}