【问题标题】:How do you return an array of structs from a function in C?如何从 C 中的函数返回结构数组?
【发布时间】:2020-05-31 10:52:18
【问题描述】:

我正在尝试在辅助函数内的数组中创建一个结构数组和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;
}

我的主要问题是如何创建一个预定义大小 (MAXFILES) 的结构数组并从函数中返回它,以便我可以访问 main 中的结构数组。我必须使用malloc 分配内存吗?

【问题讨论】:

  • files 是一个指针数组。函数的返回类型只是struct fentry 的指针。您可能需要返回类似files[some_index] 的内容。尝试返回files[0],它会编译没有错误。
  • fentry 未定义。您使用的是 C++ 编译器吗?

标签: c arrays function pointers struct


【解决方案1】:

如果你包装数组,你也可以返回值。

#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;
}

【讨论】:

    【解决方案2】:

    例如,您必须使用 malloc 为其分配空间,因为正如您从错误中看到的那样,您返回了一个指向本地地址的指针,这是一个问题,因为一旦您退出此函数,files 数组将是释放/不存在。所以你返回的指针会指向一个无效的内存位置。

    所以做这样的事情:

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

    同样在这种情况下,不要忘记在不再需要时使用free(*ptr_to_array) 释放分配的内存。

    【讨论】:

    • 我尝试按照您的建议将代码的第二行更改为 malloc 。但是我得到了同样的错误(不兼容的指针类型,不是局部变量错误)。
    • 试试struct fentry *files = malloc(MAXFILES * sizeof(fentry);也许是我在这里忽略的。
    • 是的,我试过了,它仍然返回同样的问题:(
    • 这里需要maxbe类型转换struct fentry *files = (stuct fentry*) malloc(MAXFILES * sizeof(fentry);
    • 抱歉,您的第一条评论是正确的。我忘了在声明中添加“struct”关键字。谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多