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

如何从pthread_create传递的void指针中获取可用于switch的整型值

问题核心原因

你当前的类型转换逻辑存在根本性错误:&opt取的是routine函数形参opt自身的栈内存地址,既不是你传入的num1的地址,也不是num1的存储值,自然无法得到正确结果。


修正方案(匹配你当前传参逻辑)

你调用pthread_create时传递的是num1变量的地址&num1,routine的形参opt存储的就是这个地址,需要先做指针类型转换再解引用取值,修正后的代码如下:

void* routine(void* opt) {
    // 先将void*转为intptr_t类型指针,再解引用获取原num1的值
    long int n = *(intptr_t*)opt;
    switch(n) {
    case 0: 
        printf("Test 0 from threads\n");
        break;
    case 1: 
        printf("Test 1 from threads\n");
        break;
    };
    sleep(3);
    printf("Ending thread...\n");

    return NULL;
}

注意:该方案需要保证线程执行取值时,原作用域的num1变量未被销毁,避免出现野指针问题


更稳妥的简化方案(传值无需考虑生命周期)

如果只是传递整数类的小参数,可以直接把值强制转为void*传递,不需要传地址,省去解引用步骤也没有野指针风险:

  1. 调整pthread_create调用逻辑:
intptr_t num1 = 0;
// 直接把值转为void*传递,无需取地址
pthread_create(&t1, NULL, &routine, (void*)num1);
  1. 调整routine内的转换逻辑:
long int n = (long int)opt;

内容的提问来源于stack exchange,提问作者marti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:24:07