二级指针作为传出参数不能直接如下定义:
void** ret;
1 #include <pthread.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <stdlib.h>
6 void* thread_func(void* arg)
7 {
8 pthread_exit((void*)77);
9 }
10
11
12 int main(void)
13 {
14 pthread_t tid;
15 int ret;
16 void** retval = (void**)malloc(100);
// void** retval;
17 //printf("*retval = %d\n",(int)(*retval));
18 //void* ret1 =(void*)(*retval);
19 //printf("**retval=%d\n",*(int*)(ret1));
20 pthread_attr_t attr;
21 ret = pthread_attr_init(&attr);
22 if(ret != 0)
23 {
24 printf("failed init thread attr\n");
25 exit(1);
26 }
27 ret = pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
28 if(ret != 0)
29 {
30 printf("failed set detachstate\n");
31 exit(1);
32 }
33 ret = pthread_create(&tid,&attr,thread_func,NULL);
34 if(ret != 0)
35 {
36 printf("failed create thread\n");
37 exit(1);
38 }
39 printf("sucess create thread\n");
40 ret = pthread_join(tid,retval);
41 printf("join ret = %d,exit code = %d\n",ret,(int)(*retval));
42 pthread_exit((void*)1);
43 return 0;
44
45 }
如果将第16行直接写成void** retval,则会被初始化为NULL;NULL无法保存一级指针;会导致段错误;
// void** retval;
17 //printf("*retval = %d\n",(int)(*retval));
18 //void* ret1 =(void*)(*retval);
19 //printf("**retval=%d\n",*(int*)(ret1));
上面4行会导致段错误;