二级指针作为传出参数

二级指针作为传出参数不能直接如下定义:
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行会导致段错误;

猜你喜欢

转载自blog.csdn.net/weixin_37603532/article/details/89434794
今日推荐