pthread_create传递结构体参数时报指针类型不兼容错误的解决方法
报错根因
pthread_create 对线程入口函数的签名有强制统一要求,它只接受签名为void *(*)(void *)的函数指针:也就是函数必须接收一个无类型的void*指针作为入参,最终返回一个void*类型的值。
你现在定义的check_subgrid直接把形参写死成了具体的struct thread_args *p类型,和pthread要求的通用函数指针签名类型不兼容,这才触发了类型不匹配的编译报错——这个问题和你传结构体数组当参数的写法本身没关系,核心卡点在线程入口函数的签名定义上。
具体修复步骤
- 先把线程入口函数的签名改成标准格式:把
check_subgrid的形参从struct thread_args *p换成通用的void *p,进函数内部之后再做强制类型转换就行,改完的函数代码框架如下:void* check_subgrid(void *p) { // 无类型入参在内部强转为实际使用的结构体指针 struct thread_args *args = (struct thread_args *)p; int x = args->a; int y = args->b; int z = args->c; for (int i = x; i < x + 3; i++) { int check[9] = {}; for (int j = y; j < y + 3; j++) { if ( check[ sudoku[i][j] - 1 ] == 0 ) { check[ sudoku[i][j] - 1 ] = 1; } else { valid[2][z] = -1; break; } } } valid[2][z] = (valid[2][z] == -1) ? 0 : 1; return NULL; } - 你之前写的传参代码不需要改:
pthread_create(&p_thread[2], NULL, check_subgrid, (void*)&(p[0]))这行的参数转换完全符合pthread的要求,只要把函数签名对齐,编译报错就会直接消失。 - 顺带提个代码逻辑的小漏洞:现在的循环里,内层j循环检测到重复值触发break时,只会跳出当前的列循环,外层的行循环还会继续跑剩下的检测,建议在标记
valid[2][z] = -1之后加个外层break,没必要做多余的重复计算。
内容的提问来源于stack exchange,提问作者이재하
相关产品推荐
相关产品推荐

