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) - 指定 ... 跟随 aAeEfFgG 转换说明符适用于类型为 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

写入位置0x00460000时发生访问冲突,这是啥原因?