我有两个文件,一个叫做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);
请告诉我为什么这段代码有效!!
答案 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