2011-08-26 62 views
4

我有两个文件,一个叫做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); 

为什么此代码的工作请咨询我!

+2

'RFile'落得被存储在同一个地方'NFile'无论出于何种原因(或相同的文件描述符或一切用过的)。 – user786653

+0

可能N和R共享相同的Filedescriptor,因为你关闭了NFile释放它的描述符,当打开RFile时,OS只给了你相同的描述符,但是为了不同的文件。我假设你在* NIX平台上。 – RedX

回答

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 
+0

非常感谢Skizz。你100%正确,R和N有相同的指针:D。现在我懂了。 – Louis

相关问题