[英]Typecasting integer to pointer to integer in c
我在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(&thread,NULL,fxn,&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);
}
给出分段错误,核心倾倒......为什么?
从技术上讲, (int *)5
将5
解释为地址。 结果通常是指向地址空间中地址0x0005
的指针。
在这种情况下,这几乎肯定不是真正的意图。 (如果你没有做低级系统的话,这样的地址几乎总是无效的,此时你可能还没有pthread_create
可用。)
这里,由于pthread_create
将void *
作为一些“额外数据”传递给线程的启动函数(在本例中为fxn
),因此您希望通过该参数传递的任何数据都必须转换为指针。
fxn
的代码通常包含一个类似于(int)t
的表达式,将指针转换回整数。 这基本上是可以用它完成的唯一有用的东西 - 你是唯一一个知道你的指针不是真正的指针,如果有的话(比如说,你的main
函数的最后一行......)曾试图将它实际用作指针,它很可能会引发段错误。
您没有收到错误,因为通过强制转换告诉编译器您知道自己在做什么。
cast (int*)5
将(int*)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 ) ;
(int*)5
表示将5转换为指向int的指针。
这使得可以将指向内存中的5的指针传递给函数pthread_create
。
例如:
(int) 5; //cast to int
(int *) 5; //cast to pointer to int
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.