查看pthread_create(...)
的手册页,我看到定义如下......
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
我的第一个问题是在pthread_create
传递参数3时;我是在转换函数名的地址还是只是函数名?对我而言似乎产生了相同的结果......那么它们之间的区别是什么?
(void *)&function_name
(void *)function_name
我的第二个问题是在传递参数4时在pthread_create中,我们是否应该总是给出args变量的地址,如
(void *) &variable
或者我们可以直接传递像
这样的值(void *)variable
感谢。
答案 0 :(得分:4)
继续上述评论......
(1)pthread_create
启动功能(第3个参数)必须具有
void *(*start_routine) (void *)
即一个带有void指针并返回void指针的函数。例如:
void* myfunc(void *)
您收到编译错误,因为您的启动函数可能(并且不正确)看起来像这样:
void myfunc(void)
换句话说,一个函数采用 no 参数并且不返回任何结果。你通过将myfunc转换为指向void的指针来解决这个编译错误,但这是不必要的和错误的。你真正的问题是你的启动函数“myfunc”有错误的签名。
(2)看起来你已经陷入虚空,指向虚空。这里有几个很好的答案,包括this。基本上,指向void的指针是一个通用指针,可以指向任何类型。
pthread_create
本身就是使用void ptrs的一个很好的例子。因为启动函数无法知道开发人员想要从函数传递(并返回)哪种数据,所以他们使用可以指向任何类型的void ptr。取决于启动函数的开发者,然后将void ptr转换为他实际传递的适当类型,然后再使用void ptr指向的内容。所以现在start函数可以处理一个ptr,它实际上可能指向int,double,数组,结构等等。
在您的情况下,您将指向具有特定签名的函数的指针转换为指向任何内容的指针。这可能会满足编译器,因为它假定您知道自己在做什么。但是在这种情况下你没有,因为你正在写真正的错误,即你的启动函数的签名是错误的。
答案 1 :(得分:1)
函数和数组地址将带或不带&。
但其他变量不会,你仍然应该使用(void *)&变量。