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

为什么对void指针解引用不生效?如何正确使用void指针取值

为什么void指针直接解引用无法正常工作

C语言标准明确规定void是不完整类型,不存在与之匹配的内存大小、数据解析规则。指针解引用的本质是根据指针类型,读取对应长度的内存并按类型规则解析内容:当你使用int *类型指针时,编译器知道需要读取4字节(32位int场景)内存并按照整数规则解析;但void *没有携带任何类型信息,编译器无法确定要读取多少字节、如何解析内存内容,因此直接对void *解引用属于非法操作,会触发编译错误或者未定义行为,自然无法得到预期的12。

void指针的正确使用方法
  • 打印void指针指向的内存地址
    直接使用printf的%p格式符即可,为了兼容不同编译器的传参规范,建议统一强转为void*类型输出,示例如下:
printf("ptr指向的内存地址为:%p\n", (void *)ptr);
  • 读取void指针指向的存储数值
    必须先将void *强制转换为和原始存储数据匹配的指针类型,再进行解引用操作,针对你的场景完整可运行代码如下:
int main()
{
    int b = 12;
    void *ptr = &b;
    // 打印地址
    printf("ptr指向的地址:%p\n", (void *)ptr);
    // 先强转为int*再解引用读取数值
    printf("地址存储的数值:%d\n", *(int *)ptr);
    return 0;
}

注意:void指针的核心作用是存储通用内存地址,本身不携带类型信息,使用前必须明确知晓它指向的原始数据类型,再做对应类型的强转,否则会出现内存解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:54:02