向pthread_create传递嵌套结构体报错:指针类型转换问题求解
解决pthread_create参数类型不匹配问题
我看了你的代码,编译器报的cannot convert to a pointer type错误原因很明确:pthread_create的第四个参数要求是void*类型,但你传的是Parameter[i]——这是一个struct param结构体变量,不是指针,类型自然不匹配。而且你的代码里还有个隐藏的内存分配错误,我一起给你修复,完全保持你原来的代码风格:
错误根源&修复步骤
- 内存分配错误:你给
Parameter分配内存时用了sizeof(struct param*),这是分配了threads个指针的空间,但我们需要的是threads个完整的struct param结构体空间,所以要改成sizeof(struct param)。 - 参数传递错误:
pthread_create需要传递参数的指针,所以要把Parameter[i]改成&Parameter[i],把每个结构体的地址传进去,这样就能转换成void*了。
修改后的完整代码
#include <pthread.h> #include <stdlib.h> struct data{ double **A; double **B; double **C; }; struct param{ struct data *v; // A,B,C int n, i; }; // 这里对齐你代码里的runner函数,原代码里的matrix_vector应该是笔误? void* runner( void* param) { // 把void*转成struct param*来访问线程参数 struct param *p = (struct param*)param; // 在这里实现你的矩阵运算逻辑,比如用p->v->A、p->i、p->n这些变量 return NULL; } int main(int argc, char **argv) { int threads=10; // 注意:这里的A/B/C需要后续初始化内存,否则会是野指针 double **A,**B,**C; struct data v; v.A=A; v.B=B; v.C=C; struct param *Parameter; // 修正内存分配:分配threads个struct param结构体的空间 Parameter=malloc(threads*sizeof(struct param)); for(int i=0;i<threads;i++) { Parameter[i].v=&v; Parameter[i].i=i; // 这里改成循环变量i,不然所有线程的索引都是0,应该不是你的本意 Parameter[i].n=threads; } pthread_t* threadNumber; threadNumber = malloc(sizeof(pthread_t)*threads); for (int i =0 ;i<threads;++i) { // 修正参数传递:传入结构体的地址 pthread_create(&threadNumber[i],NULL,runner,(void*)&Parameter[i]); } for(int i=0;i<threads;++i) { pthread_join(threadNumber[i],NULL); } // 记得释放内存,避免泄漏 free(Parameter); free(threadNumber); // 后续还要记得释放A/B/C的内存(如果之前分配了的话) return 0; }
额外提示
- 我给线程函数加上了参数转换的代码,你需要在里面补充具体的矩阵运算逻辑。
- 原来的代码里所有线程的
i都赋值为0,这大概率不是你的需求,我改成了Parameter[i].i=i,让每个线程拿到自己的索引值。 - 最后一定要记得释放分配的内存,避免内存泄漏问题。
内容的提问来源于stack exchange,提问作者liebe
相关产品推荐
相关产品推荐

