程序因 fclose 而崩溃

Program crashes with fclose

我正在使用以下文本文件:https://mega.nz/#!EN4iRJxA!VtKFEl9dlQHWHIzcgfOfpXTt9_ill_YkgsLWL3nORLg 以及以下代码:

    #include <stdio.h>
    #include <stdlib.h>

    typedef struct
    {
        int id;
        char lastname[25];
        char name[20];
        float average;
    }student;

    int main(){
        int i;
        student *pointer= (student*) malloc(3);

        FILE *file= fopen("Struct.txt", "r");
        fread(pointer, sizeof(student), 3, file);
        for(i= 0; i< 3; i++){
            printf("Id: %d\nName: %s\nLast name: %s\nAverage: %.2f\n",
                (pointer+ i) -> id,
                (pointer+ i) -> name,
                (pointer+ i) -> lastname,
                (pointer+ i) -> average);
        }
        fclose(file);
        system("pause");
        return 0;   
    }

当我删除 fclose 函数时它起作用了,但我检查了一下它似乎是正确的。我错过了什么?

这与您的 fclose 无关,您需要解决两件事:

  • 您需要检查fopen的return错误:

    if( NULL == file )
    {
        printf( "Cannot open\n" );
        exit( 1 );
    }
    
  • 你的 malloc 代码看起来不对,应该是: student *pointer= malloc(3 * sizeof(student));

您的程序没有按照您认为的方式分配内存。 malloc(3) returns three bytes of memory。文件指针很可能在内存中紧随其后

[ | | ][*FILE]

当您读入文件时,数据首先进入您分配的三个字节的内存中。但由于它不适合,它继续运行并覆盖包含指向文件的指针的内存。

[student data student data]

然后调用 fclose 关闭文件 dat 或从文件中读取的任何内容。这是一个编程错误,有时称为 "wild pointer dereference",如果读入的数据没有指向可以像文件一样关闭的东西(正如您正在发生的那样),程序将崩溃。

artm 建议的修复应该可以解决您的问题,但我认为此解释可能有助于您理解崩溃的原因。