看man手册,发现返回值是个普通指针。人家用二级指针来承接,可能准备干大事。这个能够本身搜索一下。缘由嘛,二级指针是保存了这个地址。一级指针承接的话就是这个地址。函数
那既然二级指针保存了,咱们如何访问那?开始我以为直接来个二级指针,而后*访问算了,可是下面的东西。让你不能那么干了!其实非要那样也能够 malloc呗!post
线程建立函数pthread_create的函数原型以下:线程
int pthread_create(pthread_t *restrict thread,
const pthread_attr_t *restrict attr,
void *(*start_routine)(void*), void *restrict arg);指针
其中,thread是要建立的线程;rest
attr指定线程的属性,缺省值为NULL;blog
start_routine是线程要执行的函数;原型
arg是传递给线程执行的函数的参数;string
要注意的是:start_routine是函数指针it
线程等待函数pthread_create的函数原型以下:io
int pthread_join(pthread_t thread, void **value_ptr);
其中,thread是要等待的线程名;
value_ptr:指针*value_ptr指向线程返回的参数
在使用时要注意的是:针对value_ptr,应该先声明一个一级指针,而后经过取地址的方式传给pthread_create函数,而不该该直接定义一个二级指针,将这个二级指针直接传递给pthread_create。
如:
正确的传递方法:
void *ret;
pthread_join(thread, &ret);
错误的传递方法:
void **ret;
pthread_join(thread, ret);
缘由:pthread_join中有一句类型这样的语句:(* value_ptr) = arg;若是按照正确的方式传递参数,左边的语句实际上完成的操做是:ret = arg;一点问题没有。可是,当按照错误的方式传递参数时,会出现一句致命的错误:(* value_ptr),它对一个尚未初始化的指针进行了取值操做,这是系统所不容许的,此时(* value_ptr)等价于*ret,*ret仍是一个指针,是一个二级指针,可是*ret是一个野指针!
注意啊!你返回的是一个一级指针,那么存储就只能是用 * &ret 来存储(但愿你懂,就是指针降级)=ret;
那么输出天然也就是 ret了。
下面是一个例子:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#define N 64
int a = 10;
void * handler(void *arg)
{
printf("a=%d, %s\n", a, (char *)arg);
strcat((char *)arg, " ......");
pthread_exit(arg);
}
int main()
{
pthread_t tid;
char buf[N] = {"welcome"};
void *result;
if (pthread_create(&tid, NULL, handler, (void *)buf) != 0) exit(-1); printf("*\n"); pthread_join(tid, &result); printf("ret:%s\n", (char *)result); return 0;}