我正在尝试使用在运行时创建的数组填充结构成员并获得以下错误:
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;
}
我该如何解决这个问题?
答案 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)
。