如果指定的指针关闭,为什么C会自动处理下一个可用的指针?

时间:2014-11-13 02:12:51

标签: c pointers fclose

我对C中的FILE指针操作有疑问;具体而言,当命令使用关闭的文件指针时会发生什么。

这是一个例子

FILE *fp1;
fp1 = fopen(file1,"r");
function1(fp1);
fclose(fp1);

FILE *fp2;
fp2 = fopen(file2,"r");
function2(fp1);      
fclose(fp2);

所以我发现是:因为fp1关闭,代码会自动使用下一个打开/链接指针,在这种情况下,是fp2。但是,如果代码更改为

FILE *fp1;
//fp1 = fopen(file1,"r");
//function1(fp1);
fclose(fp1);

FILE *fp2;
fp2 = fopen(file2,"r");
function2(fp1);      
fclose(fp2);

会出现分段错误。另外,如果在fp1和fp2之间有一个打开文件指针fp3,并且fp1关闭,代码将选择fp3。

我不确定这种处理已删除/关闭的FILE指针的方式只是一种特定于语言的故障安全机制,还是与这些指针变量在物理内存中的方式有​​关?在fclose()之后这些指针会发生什么?

例如。如果所有FILE指针连续存储在内存中并且fclose只删除当前指针使用的内存,则C将访问下一个可用内存块以获取该值。

PS:我不确定所有FILE指针是否与其他变量分开存储,所以我通过在上面的fp1和fp2段之间插入一个新的int指针来测试它。它不会干扰FILE指针"继承"处理。那么FILE指针可能是单独存储的吗?

例如。但是,如果flcose()使当前指针成为NULL指针,那么使用当前指针的任何命令是否只会产生错误?

谢谢!

2 个答案:

答案 0 :(得分:4)

FILE上调用fp1后,对fclose指向的fp1执行任何操作都会导致未定义的行为。很可能发生的事情是,由于fp2指向的内存已被释放以供重用,fp1恰好具有与fp1之前相同的值变为无效,因此当实现解引用fp2时,它会访问{{1}}指向的内存。

答案 1 :(得分:1)

如果要打开一些东西并将其分配给指针,那么接下来应该做的就是验证这是否成功。除此之外,这里是根据您发布的代码解释您所看到的行为:

首先,它不是"自动使用"下一个文件指针。当您关闭fp1然后立即fopen并将其分配给fp2时,动态内存模块只是重用相同的内存块。您无法保证这种行为,但由于您的代码非常简单,因此无论使用何种内存管理库,都几乎可以保证发生。

其次,当你在不打开它的情况下fclose(fp1)时,系统不会产生分段错误......你是。您实际上正在对从未分配的内容发生free()调用。