我在某个pthreads程序中看到过这样的东西...
#include<pthread.h>
#include<stdio.h>
void *fxn(void * t)
{
//some code
}
int main()
{
//some code
pthread_create(&thread,NULL,fxn,(int *)5);
//some code
}
这里,(int *)5做什么? 为什么它不会产生警告/错误? 另外,它与pthread_create(&amp; thread,NULL,fxn,&amp; x)有何不同;其中x = 5的类型为int?
编辑:
这很好用:
#include<pthread.h>
#include<stdio.h>
void * fxn(void *t)
{
pthread_exit(t);
}
int main()
{
pthread_t th;
void *ret;
int i=5;
pthread_create(&th,NULL,fxn,&i);
pthread_join(th,&ret);
printf("%d\n",*(int *)ret);
}
但是,
#include<pthread.h>
#include<stdio.h>
void * fxn(void *t)
{
pthread_exit(t);
}
int main()
{
pthread_t th;
void *ret;
int i=5;
pthread_create(&th,NULL,fxn,(int *)5);
pthread_join(th,&ret);
printf("%d\n",*(int *)ret);
}
给出分段错误,核心转储......为什么?
答案 0 :(得分:3)
从技术上讲,(int *)5
将5
解释为地址。结果通常是指向地址空间中地址0x0005
的指针。
在这种情况下,这几乎肯定不是真正的意图。 (如果你没有做低级别的系统内容,这样的地址几乎总是无效的,此时你可能还没有pthread_create
可用。)
此处,由于pthread_create
需要void *
作为一些&#34;额外数据&#34;传递给线程的启动函数(在本例中为fxn
),无论你想通过该参数传递什么数据都必须转换为指针。
fxn
中的代码通常会包含类似(int)t
的表达式,以将指针转换回整数。这基本上是唯一可以用它完成的有用的东西 - 你是唯一一个知道你的指针不是真正指针的人,如果有的话(比方说,你的main
函数的最后一行......)试图将它实际用作指针,它很可能会触发段错误。
答案 1 :(得分:1)
您不会收到错误,因为通过投射告诉编译器您知道自己在做什么。
强制转换(int*)5
将5转换为指向某个(非常可能)无效地址的int指针。要在线程中获取该值,必须将void指针强制转换为整数(int)t
。不要这样做。
传递&x
,获取指向变量x
的指针,您可以在线程函数中使用它。与此类似:
int x = 123 ;
int* px = &x ;
pthread_create(&thread,NULL,fxn,px);
在线程中:
int* pt = t ;
printf( "%d" , *pt ) ;
答案 2 :(得分:-1)
(int*)5
表示将5转换为指向int的指针。
这使得可以将指向内存中的5的指针传递给函数pthread_create
。
例如:
(int) 5; //cast to int
(int *) 5; //cast to pointer to int