使用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
相关产品推荐
相关产品推荐

