程序因 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 建议的修复应该可以解决您的问题,但我认为此解释可能有助于您理解崩溃的原因。
我正在使用以下文本文件: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 建议的修复应该可以解决您的问题,但我认为此解释可能有助于您理解崩溃的原因。