(void*)4 :将整形4转化为地址值0x4
今天自己写了个程序,自己差点没有解释通。
刚开始写成pthread_exit(0);编译,运行没问题
写成pthread_exit(4); 编译警告,运行没问题。
警告,原因如下:
jointhread.c: 在函数‘assisthread’中:
jointhread.c:9:18: 警告:传递‘pthread_exit’的第 1 个参数时将整数赋给指针,未作类型转换 [-Wint-conversion]
pthread_exit(4);
^
In file included from jointhread.c:4:0:
/usr/include/pthread.h:244:13: 附注:需要类型‘void *’,但实参的类型为‘int’
extern void pthread_exit (void *__retval) __attribute__ ((__noreturn__));
主要是类型有问题,0就是特殊,可以看成NULL。
pthread_exit (void *__retval)需要void * 类型的变量。
pthread_exit((void*)4);改成这样就行了。
//file:jointhread.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
void * assisthread(void * arg){
printf("I am helping to do some jobs\n");
sleep(3);
pthread_exit((void*)4);
}
int main(int argc, const char *argv[])
{
pthread_t assistthid;
int status;
pthread_create(&assistthid, NULL, (void*)assisthread, NULL);
pthread_join(assistthid, (void*)&status);
printf("assistthread' exit is cased %d\n",status);
return 0;
}
运行结果:
I am helping to do some jobs
assistthread' exit is cased 4
问题来了:(void*)4是什么鬼?
首先是类型转换,这个大家都知道。就是将4转化成地址值:(void*)4=0x4
而这里我用了(void*)&status去接收了这个地址值(0x4)
status变量本身有一个地址,假设为8000,而status地址(8000)的内容,又放了一个地址值(0x4)
然后,打印的时候又用了%d,就把这个地址值转化成整数4了。
自己写个小例子就明白了:
void *a;
a=(void*)2;
printf("(void*)2=%p, a=%d\n", (void*)2, a);