看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;}