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

C语言中(void *)1/(void *)2的含义?线程类型转换疑问

关于Unix线程返回值的疑问解答

1. (void *)1、(void *)2的具体含义

这里的(void *)1和(void *)2不是用来表示内存地址的,而是借由pthread线程返回值的设计——pthread_join接收的返回值为void**类型,允许线程返回任意指针类型数据——把整数伪装成指针传递。本质是用指针的存储空间来存小整数,作为线程的退出状态码,比如用1、2标记不同的线程退出结果,还能省去专门分配内存传递返回值的步骤,避免内存泄漏。

2. 将void*类型转换为long是否合法

在POSIX标准及大多数现代Unix系统(如Linux、BSD)中,这种转换是合法且安全的,核心前提是系统满足sizeof(void*) == sizeof(long)。POSIX规范明确允许这类整数与指针的双向转换,只要整数值在指针的可表示范围内就行。

唯一需要注意的是,部分特殊架构(如某些嵌入式系统)可能存在指针宽度与long不一致的情况,此时转换会有风险,但在常见的桌面/服务器Unix环境下完全没问题。

3. 为什么不用作内存地址

你说得没错,如果把(void *)1当作真实内存地址去解引用,必然触发段错误——因为地址1属于内核空间或未映射内存区域,用户进程没有访问权限。但示例里的用法从始至终都没打算解引用这个指针,只是把它当作承载整数的容器来传递线程退出状态,所以完全不需要去访问对应的内存。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:45:36