类型转换整数指向c中的整数

时间:2014-11-10 15:40:40

标签: c pthreads

我在某个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);
}

给出分段错误,核心转储......为什么?

3 个答案:

答案 0 :(得分:3)

从技术上讲,(int *)55解释为地址。结果通常是指向地址空间中地址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