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

pthread_create中long类型转void*指针的原理疑问

为什么long可以强制转换为void*传给pthread_create

这种转换在**POSIX兼容系统(如Linux、Unix)**下合法且安全,核心原因如下:

  • C标准的明确允许
    C语言标准支持整数类型与指针类型的显式强制转换,只要目标实现能将该整数表示为有效的指针值。POSIX系统专门适配了这种转换,用来满足线程API传递简单整数值(如线程标识)的需求。

  • 类型宽度匹配
    绝大多数现代系统中,long的字节宽度和void*完全一致:

    • 32位系统下,两者均为4字节
    • 64位系统下,两者均为8字节
      这保证了long的所有二进制位能完整存入void*,不会出现截断或数据丢失。
  • 反向转换的可靠性
    在对应的线程函数中,只需将传入的void*转换回long,就能完整还原原始数值,不会有精度损失。比如线程函数的典型写法:

void* Hello(void* arg) {
    long rank = (long)arg;
    printf("Hello from thread %ld\n", rank);
    return NULL;
}

需要注意两个限制:

  • 不要用int替代long:64位系统中int通常为4字节,而void*为8字节,强制转换会导致高位数值丢失。
  • 仅适合传递小整数:如果要传递复杂数据结构,必须用指针指向堆内存,不能用整数转指针的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:02:41