fopen()创建并返回的FILE对象是动态还是静态变量?

时间:2018-08-28 22:18:45

标签: c file

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()对象会被销毁吗?

4 个答案:

答案 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()分配的数据。