2011-08-26 64 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

相關問題