如何获取pthread_create传递的int数组值并计算对应数组长度
问题1:*arr[0] 报错的原因和修复方法
arr 已经是强转后的int *类型指针,arr[0] 本身就是取数组第一个位置的int类型值,不需要再额外加*做解引用操作,额外加*相当于尝试对一个int数值做指针解引用,自然会触发类型错误。
正确的取第一个元素的写法二选一即可:
// 写法1:下标访问 printf("%d", arr[0]); // 写法2:指针解引用,和上面等价 printf("%d", *arr);
问题2:在线程函数中获取数组长度的实现方法
C语言中数组退化为指针后,不会携带长度信息,仅靠传入的void*指针无法直接计算出数组长度,必须在创建线程时额外把长度信息一起传入,最通用的方案是用结构体封装数组参数:
步骤1:定义参数结构体
// 封装要传入线程的数组和长度 typedef struct { int *arr_ptr; int arr_len; } ThreadArrArgs;
步骤2:创建线程时传入结构体指针
注意:建议使用动态分配结构体,避免直接使用主线程栈上的临时结构体(如果主线程先于子线程执行完,栈内存会被回收导致野指针)
// 动态分配参数结构体 ThreadArrArgs *args = malloc(sizeof(ThreadArrArgs)); args->arr_ptr = array1; // array1 定义处你已知的数组长度,直接赋值即可 args->arr_len = 数组的实际长度; // 传入结构体指针 pthread_create(&id1, NULL, sorter, (void *)args);
步骤3:线程函数中解析参数
void *sorter(void *param){ // 强转为结构体指针 ThreadArrArgs *args = (ThreadArrArgs *)param; int *arr = args->arr_ptr; int len = args->arr_len; // 正常遍历数组 for(int i=0;i<len;i++){ printf("\n%d", arr[i]); } // 取数组元素 printf("%d", arr[0]); // 用完释放动态分配的参数结构体,避免内存泄漏 free(args); pthread_exit(0); }
如果不想用动态分配,也可以将结构体定义为全局变量,或者主线程调用pthread_join等待子线程执行完毕后再销毁栈上的结构体变量。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

