gpt4 book ai didi

c - 为什么此代码有效并给出正确的结果?

转载 作者:太空狗 更新时间:2023-10-29 15:27:29 25 4
gpt4 key购买 nike

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

请告诉我为什么这段代码有效!!

最佳答案

这可能取决于 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

关于c - 为什么此代码有效并给出正确的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7204241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com