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

使用void指针出现0xC0000005访问违例,请求排查原因

问题分析与解决方案

嘿,我来帮你理清这个问题~你的代码抛出异常的核心原因是对字符串指针做了不必要的解引用,咱们一步步拆解清楚:

错误点详解

printf的%s格式符要求传入的是一个char*类型的指针——它会从这个指针指向的地址开始,持续读取字符直到遇到\0结束。

而你写的*((char*)ptr)是把void*转换为char*后,又用*解引用了一次,这会取出指针指向的第一个字符(也就是'A',对应ASCII值65)。当你把这个字符值传给%s时,printf会把65当作内存地址去访问,这显然属于非法内存操作,自然会抛出异常。

修正后的代码

只需要去掉多余的解引用操作,直接传递转换后的char*指针即可:

#include <stdio.h> // 别忘了包含标准输入输出头文件,MSVC需要它哦

int main() { 
    char prenume[] = "Alexandru"; 
    char* name = prenume; 
    int age = 33; 
    float height = 1.81; 
    void* ptr; 
    
    ptr = name; 
    printf("My name is %s", (char*)ptr); // 去掉多余的*,直接传char*指针
    
    ptr = &age; 
    printf("\nAge:%d", *((int*)ptr)); // 这里是对的,%d需要int值,解引用int*得到数值
    
    ptr = &height; 
    printf("\nHeight:%2.2f", *((float*)ptr)); // 这里也正确,%f需要float值,解引用float*得到数值
    
    return 0; 
}

额外小提示

  • 针对%s:永远传递字符串的首地址(char*类型),不需要解引用
  • 针对数值类型(比如int、float):格式符需要的是具体数值,所以要把void*转换为对应类型的指针后,解引用取出数值
  • 记得在代码开头包含<stdio.h>,否则MSVC可能会给出警告或者出现不确定的运行行为

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:42:35