你好,我很难理解如何从 c 中的线程返回值。我有这个工作示例:
#define NTHREADS 4
void *neg (void * param) {
int *l;
l=(int *) param;
int *r=(int *)malloc(sizeof(int));
*r=-*l;
return ((void *) r);
}
int main (int argc, char *argv[]) {
pthread_t threads[NTHREADS];
int arg[NTHREADS];
int err;
for(long i=0;i<NTHREADS;i++) {
arg[i]=i;
err=pthread_create(&(threads[i]),NULL,&neg,(void *) &(arg[i]));
if(err!=0)
error(err,"pthread_create");
}
for(int i=0;i<NTHREADS;i++) {
int *r;
err=pthread_join(threads[i],(void **)&r);
printf("Resultat[%d]=%d\n",i,*r);
free(r);
if(err!=0)
error(err,"pthread_join");
}
return(EXIT_SUCCESS);
}
我觉得很难理解的是:
函数 neg 返回一个在 (void *) 中转换的指针 * r 指向堆中的一个值。因此基本上将地址返回到堆中。然后在 pthread_join 中,我们通过执行 &r 获得返回值(这本身似乎不合逻辑?捕获地址的地址?)然后转换为指针的指针?我们为什么要这样做?
感谢您的帮助!
最佳答案
考虑这段代码,它完全有效并打印出“5 5 5 5”。
int x = 5;
int *p = &x;
int **pp = &p;
int ***ppp = &pp;
printf("%d %d %d %d\n", x, *p, **pp, ***ppp);
return 0;
C 允许您拥有任意深度的指针,并使用相应数量的寻址运算符进行初始化。在您的示例中,您分配了一个 int *
并且该函数必须返回一个 void **
,因此您必须两次取消引用结果并将其转换,这是通过转换完成的int *
。
所以,“获取地址的地址?” 是的!好吧,一个指针的地址,它可能包含一个 int 或另一个指针的地址。
关于c - 从 C 中的线程返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37412052/