Как вы возвращаете массив структур из функции в C? - PullRequest
1 голос
/ 16 февраля 2020

Я пытаюсь создать массив структур и fread подать данные в массив внутри вспомогательной функции. Я продолжаю получать incompatible pointer type ошибки при компиляции программы. Это мой текущий код:

 struct fentry *read_fentries(FILE *fp){
    fentry *files[MAXFILES];

    // EXTRACT FENTRIES AND FNODES FROM FILE
    if ((fread(files, sizeof(fentry), MAXFILES, fp)) == 0) {
        fprintf(stderr, "Error: could not read file entries\n");
        closefs(fp);
        exit(1);
    }
    return files;
}

Terminal Output

Мой главный вопрос - как мне создать массив структур заранее определенного размера (MAXFILES) и вернуть его из функция, так что я могу получить доступ к массиву структуры внутри моего main. Должен ли я выделять память, используя malloc?

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Вы также можете вернуть значение, если оберните массив.

#define MAXFILES 50

struct _fentry
{
    FILE *fp;
    int somedata[3];
    double anotherdata[10];
    /* ... */
};

struct fentry
{
    struct _fentry entries[MAXFILES];
};


struct fentry foo()
{
    struct fentry entries;

    /* .... */

    return entries;
}
0 голосов
/ 16 февраля 2020

Вы должны выделить для него пространство, например, malloc, потому что, как видно из ошибки, вы возвращаете указатель на локальный адрес, что является проблемой, поскольку после выхода из этой функции массив files будет освобожден / не существует. Таким образом, возвращаемый вами указатель будет указывать на недопустимое расположение в памяти.

Так что сделайте что-то вроде этого:

struct fentry *files = malloc(MAXFILES * sizeof(fentry);

Также в этом случае не забудьте освободить выделенную память с помощью free(*ptr_to_array), когда больше не нужен.

...