我有两个文件,一个叫做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)
请告诉我为什么这个代码工作!
这可能取决于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)
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |