Является ли объект `FILE` созданным и возвращаемым функцией` fopen () `динамической или статической переменной? - PullRequest
0 голосов
/ 29 августа 2018

Является ли 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 голосов
/ 29 августа 2018

fp является указателем на FILE объект. Переменная fp имеет автоматическую продолжительность хранения в функциональном блоке FILE *open_data(void).

Данные, на которые указывает указатель fp, объект FILE, зависят от реализации fopen(). Это могут быть данные со статической продолжительностью хранения в некоторых реализациях систем, т.е. static FILE obj; FILE *fopen() { return &obj; }, но это могут быть данные с распределенной продолжительностью хранения, выделенной и освобожденной с использованием функций динамического выделения памяти внутри вызовов fopen() и fclose(). Например, посмотрите на openbsd, есть вызов fopen () для __sfp () , который должен найти свободный объект FILE из списка или, если он не найден, он должен выделить следующий файл объект .

0 голосов
/ 29 августа 2018

Объект FILE, на который fopen() возвращает указатель, выделяется из кучи или статического объекта. В обоих случаях его можно использовать, пока файл не будет закрыт fclose(). Вернуть его из open_data() вполне нормально.

0 голосов
/ 29 августа 2018

open_data, а также fopen, не возвращает объект FILE, но указатель на объект FILE. Этот объект был назначен статически или динамически fopen.

Если бы он был выделен автоматически (то есть как локальная переменная в fopen), то его адрес был бы недействительным.

0 голосов
/ 29 августа 2018

Значение FILE*, возвращаемое функцией fopen (), является указателем на структуру, выделенную системой. Хотя сам указатель будет автоматически извлечен из стека, когда функция вернет данные, на которые она указывает, не будет.

Вы должны позвонить fclose(), чтобы освободить данные, выделенные fopen().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...