You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:45:01