由FILE
创建并返回的fopen()
对象是动态变量还是静态变量或其他东西?
在以下示例中,
#include <stdio.h>
FILE *open_data(void) {
FILE *fp;
if ((fp = fopen("datafile", "r")) == NULL)
return (NULL);
return (fp);
}
由FILE
创建并返回的open_data()
对象是自动变量吗?如果没有,它的存储期限和链接是什么?
当返回对open_data()
的调用时,由FILE
创建并返回的open_data()
对象会被销毁吗?
答案 0 :(得分:2)
FILE
向其返回指针的fopen()
对象是从堆中分配的,还是从静态对象中分配的。在这两种情况下,都可以使用它,直到用fclose()
关闭文件为止。从open_data()
返回它完全可以。
答案 1 :(得分:2)
open_data
以及fopen
不会返回FILE
对象,而是返回指向FILE
对象的指针。 fopen
静态或动态分配了该对象。
如果它是自动分配的(即作为fopen
中的局部变量),则其地址将无效。
答案 2 :(得分:2)
populateContacts
是指向fp
对象的指针。 FILE
变量在fp
功能块中具有自动存储持续时间。
FILE *open_data(void)
指针指向的数据fp
对象取决于FILE
的实现。在某些系统实现中,它可能是具有静态存储持续时间的数据。 fopen()
,但可能是在static FILE obj; FILE *fopen() { return &obj; }
和fopen()
调用中使用动态内存分配功能分配和释放的已分配存储持续时间的数据。例如,查看openbsd,从fopen() call to __sfp()开始的应该是find free FILE object from list,如果没有找到,应该是allocate next FILE object。
答案 3 :(得分:1)
从fopen()返回的FILE*
值是系统分配的结构的指针。当函数返回指向它的数据时,指针本身将自动从堆栈中弹出。
您必须调用fclose()
才能释放fopen()
分配的数据。