C++:0xC0000005:访问冲突写入位置0x00000000
Posted
技术标签:
【中文标题】C++:0xC0000005:访问冲突写入位置0x00000000【英文标题】:C++: 0xC0000005: Access violation writing location 0x00000000 【发布时间】:2015-01-15 01:33:48 【问题描述】:我想知道是否可以在我的程序上获得一些帮助。如标题所述,我的程序出现访问冲突。我意识到它与取消引用垃圾指针有关,而且我很确定我已经缩小了它中断的范围,我只是不确定它为什么会实际中断,以及如何修复它。代码如下:
void determineInputType(char input[kMaxUserInput])
char* flag = NULL;
if (*(flag = strchr(input, '.')) != NULL)
double grade = 0;
if ((sscanf(input, "%lf", grade)) == 1) // problem is on this line
//rest of the code continues here
我是如何获得输入的:
void getUserInput(char* userInput)
printf("Enter a student's grade: ");
fgets(userInput, kMaxUserInput, stdin);
clearCRLF(userInput);
最后是主要的:
int main(void)
char userInput[kMaxUserInput] = 0 ;
getUserInput(userInput);
determineInputType(userInput);
return 0;
对此的任何帮助将不胜感激,因为它困扰了我一段时间。非常感谢您抽出宝贵的时间,如果还有什么需要发布的,请告诉我。
【问题讨论】:
我还注意到这一行中的另一个问题:if (*(flag = strchr(input, '.')) != NULL)
...您正在取消引用指针flag
,而它可能是NULL
。你应该把它改成if ((flag = strchr(input, '.')) != NULL)
是的,这是我之前测试的,看看是否能解决问题,我可能应该摆脱它。
【参考方案1】:
scanf
系列要求您提供一个指针,指向要填充的值:
if ((sscanf(input, "%lf", &grade)) == 1) // problem is no longer on this line
按照您的方式,将grade
设置为零,然后使用 that 作为指针。
标准的相关部分(C++11 遵循的 C99)是7.19.6.2 /12
(我的粗体字):
a,e,f,g
- 匹配可选带符号的浮点数、无穷大或NaN
,其格式与strtod
函数的主题序列的预期格式相同。 对应的参数应该是一个指向浮动的指针。的参数
l
(ell) - 指定 ... 跟随a
、A
、e
、E
、f
、F
、g
或G
转换说明符适用于类型为 pointer to double; ...
【讨论】:
以上是关于C++:0xC0000005:访问冲突写入位置0x00000000的主要内容,如果未能解决你的问题,请参考以下文章
处有未经处理的异常:0xC0000005:写入位置0x00EFA000时发生访问冲突.
0xC0000005: 写入位置 0x0000000002450040 时发生访问冲突
C语言:0xC0000005: 写入位置 0x00000000 时发生访问冲突。
c++错误0x... 处(位于... .exe 中)引发的异常: 0xC0000005: 读取位置 0x...时发生访问冲突?
在 filePath.exe 中的 0x793F3729 (vcruntime140d.dll) 处引发异常:0xC0000005:访问冲突写入位置 0xCDCDCDCD