Parser.exe中的(ntdll.dll)抛出异常:访问冲突读取位置

时间:2016-08-09 06:31:11

标签: c access-violation

所以,这是到目前为止困扰我的那一章

void CNCread(fPointer){
    printf("\n");
    fPointer = fopen ("CNCG.txt", "r");
    char line[30];
    while(!feof(fPointer)){
        fgets( line, 150, fPointer);
        puts(line);
    }
    fclose (fPointer);
    return;
}

编译,运行和执行此函数后,我收到以下错误:

Parser.exe中0x00007FFCA1DEEAC5(ntdll.dll)抛出异常:0xC0000005:访问冲突读取位置0xFFFFFFFFFFFFFFFF。

我刚刚将这个项目从Code :: Blocks转换为Visual Studio 2015,添加了legacy_stdio_definitions.lib等等,所以这也不是问题,但是代码在code :: blocks下运行良好。 感谢大家提前。

1 个答案:

答案 0 :(得分:0)

首先,char line[30]可以包含最多30 char个,但您尝试通过fgets( line, 150, fPointer);向其中写入更多内容。

此外,您不会检查fopen是成功还是失败。您还应该检查fgets是成功还是失败。

此外,您可以在函数内声明fPointer,而不是将其作为函数参数。它应该是FILE *类型。

void CNCread(/* fPointer */){
    printf("\n");
    FILE *fPointer = fopen ("CNCG.txt", "r");

    /* Check if fopen succeded */
    if (fPointer == NULL) {
        fprintf(stderr, "Error: Cannot open file to read\n");
        /* Some code */
        return;
    }

    char line[30];
    while(!feof(fPointer)){
        /* You are writing more chars to line than its capacity */
        /* fgets( line, 150, fPointer); */
        /* Change it to write at max 30 chars to line */
        if (fgets( line, 30, fPointer) != NULL)
            puts(line);
    }
    if (fclose(fPointer) == EOF) {
        fprintf(stderr, "Error: Cannot close the file after reading\n");
        /* Some code */
        return;
    }

    return;
}