繁体   English   中英

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

[英]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 *)55解释为地址。 结果通常是指向地址空间中地址0x0005的指针。

在这种情况下,这几乎肯定不是真正的意图。 (如果你没有做低级系统的话,这样的地址几乎总是无效的,此时你可能还没有pthread_create可用。)

这里,由于pthread_createvoid *作为一些“额外数据”传递给线程的启动函数(在本例中为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM