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

OSTEP线程API示例中void*强转数值相关正确性问题咨询

问题1:指针转数值不需要解引用的原因

你提到的两种写法对应完全不同的参数传递场景:

  • long long int value = *((long long int*)(arg)); 这种写法的前提是:arg中存储的是一块持有long long类型值的内存的地址,必须解引用访问对应内存才能拿到值。
  • 但本例中Pthread_create传参时是直接把字面量100强转为void*传入的,也就是说void*类型的arg里存储的二进制内容就是100本身,根本不是任何内存地址,也不存在需要访问的目标内存。这时候直接把arg的二进制内容强转回long long就能拿到原值,多一步解引用反而会把100当成内存地址去访问,直接触发段错误。

注意:这种用法的合法前提是sizeof(void*) >= sizeof(long long int),主流64位系统下void*占8字节,和long long长度匹配,所以可以安全使用;32位系统下void*仅占4字节,会截断long long的值,属于未定义行为。

问题2:返回值写法的合法性以及和返回局部变量指针的区别
  • 这种写法在满足上述长度匹配前提的条件下是完全合法的。
  • 和「返回局部变量的指针」的错误实践有本质区别:
    • 「返回局部变量指针」的错误根源是:返回值是局部变量的栈内存地址,线程函数执行结束后栈空间会被回收,后续访问该地址属于访问已释放内存,是非法操作。
    • 本例中return (void *) (value + 1)根本没有返回任何内存地址,而是直接把value + 1这个数值本身的二进制内容塞到void*类型的返回值存储空间里传递出去,全程没有用到指针的寻址功能,完全不存在指向已释放内存的问题。后续pthread_join拿到返回值后直接强转回long long类型就能拿到计算后的值,没有任何安全问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:18:01