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

Lou*_*uis 4 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);
Run Code Online (Sandbox Code Playgroud)

请告诉我为什么这个代码工作!

Ski*_*izz 6

这可能取决于C运行时库处理内存分配的方式.fopenmallocs缓冲区,因为它返回一个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
Run Code Online (Sandbox Code Playgroud)