为什么这段代码能够正常运行并给出正确的结果?

时间:2011-08-26 11:52:26

标签: c fopen fread

我有两个文件,一个叫做N.bin,另一个叫做R.bin。经过几个月的使用,我只是注意到我在那里犯了一个错误。但是,我认为系统会因此而崩溃。但首先它没有,第二个它给出了正确的结果。这是代码:

请参阅第19行,我是如何错误地从Nfile流入而不是Rfile。

//读取文件N

1       long world_features_lSize;
2       FILE* NFile;
3       double* N;
4       NFile=fopen("N.bin","r+b");
5   
6       fseek (NFile , 0 , SEEK_END);
7       lSize = ftell (NFile);
8       fseek (NFile , 0 , SEEK_SET);
9       N = (double*) malloc (sizeof(double)*lSize);
10      result = fread (N,1,lSize,NFile);
11      fclose(NFile);
    ////////////////// Read R

12      FILE* RFile;
13      double* R;
14      RFile=fopen("R.bin","r+b");

15      fseek (RFile , 0 , SEEK_END);
16      lSize = ftell (RFile);
17      fseek (RFile , 0 , SEEK_SET);
18      R = (double*) malloc (sizeof(double)*lSize);
19      result = fread (R,1,lSize,NFile);
20      fclose(RFile);

请告诉我为什么这段代码有效!!

1 个答案:

答案 0 :(得分:6)

这可能取决于C运行时库处理内存分配的方式。 fopen mallocs是一个缓冲区,因为它返回一个FILE *对象。 fclose释放缓冲区。随后的fopen将malloc一个与之前相同大小的缓冲区,它恰好返回前一个free发布的内存。如果比较R和N的指针值,它们将是相同的。

请注意,如果您在第11行和第14行之间进行了任何内存分配,那么系统就会崩溃。此外,根据调试器的工作方式和运行时间,有时可以使free函数不重用已释放的内存。

为防止将来发生此类错误,请务必执行以下操作:

fclose (handle);
handle = 0; // so you get a null pointer error if you accidentally use it again