簡體   English   中英

彈性數組成員的非靜態初始化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM