[英]non-static initialization of a flexible array member
我試圖用在運行時創建的數組填充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;
}
我怎樣才能解決這個問題?
實際上,用一個靈活的數組成員初始化一個結構並不簡單。 您將必須為收集項分配足夠的空間,以備以后要復制的條目使用。 因此,您可以編寫如下內容:
Collection *coll = malloc(sizeof(Collection)+n*sizeof(Entry));
coll->size = n;
memcpy (coll->entries, entries, n*sizeof(Entry));
除了使用這種“手寫的” malloc
之外,我沒有其他方法。
但是請注意,如果內存分配,預計在功能上做populate
,函數的簽名populate
不能原樣保留,因為它不會允許“返回”或設置一個指向新分配的Collection
-object。 在這種情況下,必須將簽名更改為void populate(int n, Collection **result)
或更改為Collection *populate(int n)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.