灵活数组成员的非静态初始化

时间:2017-06-08 21:20:44

标签: c arrays memory-management struct

我正在尝试使用在运行时创建的数组填充结构成员并获得以下错误:

error: non-static initialization of a flexible array member
             .entries = entries
                        ^

我已经将问题隔离开来并用更简单的代码复制它以使其更清晰:

#include <stdlib.h>

typedef struct entry {
    char *title;
    int id;
} Entry;

typedef struct collection {
    size_t size;
    Entry entries[];
} Collection;

// This function signature may not be changed
void populate(int n, Collection *result){

    Entry entries[n];

    for (int i = 0; i < n; ++i) {
        Entry entry = {
                .title = "Title",
                .id = i
        };

        entries[i] = entry;
    }

    Collection collection = {
            .size = n,
            .entries = entries
    };

    result = &collection;
}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

实际上,使用灵活的阵列成员初始化结构并不是直截了当的;您必须为您希望稍后复制的条目分配一个具有足够空间的集合项。所以你可以写下面的内容:

Collection *coll = malloc(sizeof(Collection)+n*sizeof(Entry));
coll->size = n;
memcpy (coll->entries, entries, n*sizeof(Entry));

除了使用这样一个&#34;手写的&#34;之外别无他法。 malloc

但是请注意,如果预期在函数populate中完成内存分配,则函数populate的签名不能保持原样,因为它不允许&#34;返回&#34 ;或者设置指向新分配的Collection - 对象的指针。在这种情况下,签名必须更改为void populate(int n, Collection **result)Collection *populate(int n)