2011-01-29 38 views
0

注意:我已經重寫了原始問題以使其更清楚。C99中的柔性陣列

我有一個名爲

VcStatus readVcard(FILE *const vcf, Vcard **const cardp) 

VCF是一個打開的文件,我會讀功能,cardp是指向卡陣列的開始。 一個文件將包含多張卡片。

readVCard一次讀取文件一行,並調用parseVcProp函數來標識行中的關鍵字,並將它們分配給結構中的適當位置。

這裏有結構

typedef struct { // property (=contentline) 
    VcPname name;  // property name 

    // storage for 0-2 parameters (NULL if not present) 
    char *partype;  // TYPE=string 
    char *parval;  // VALUE=string 

    char *value;  // property value string 
    void *hook;   // reserved for pointer to parsed data structure 
} VcProp; 

typedef struct { // single card 
    int nprops;   // no. of properties 
    VcProp prop[];  // array of properties 
} Vcard; 

typedef struct { // vCard file 
    int ncards;   // no. of cards in file 
    Vcard **cardp;  // pointer to array of card pointers 
} VcFile; 

因此,一個文件包含多個卡,卡中包含多個屬性等

的事情是,單卡可以在任何有屬性的數量。不知道有多少人,直到你讀完他們。

這是我不明白。

我該如何分配內存才能正確使用parseVcProp?

每次我打電話parseVcProp,我顯然希望它將數據存儲在一個新的結構,所以我如何在手之前分配此內存?我只是malloc(sizeof(VcProp)* 1)?

回答

3
Vcard *getcards(int n) { 
    Vcard *c = malloc(sizeof(Vcard) + sizeof(VcProp) * n); 
    c->nprops = n; 
    return c; 
} 
2

你真的需要向我們展示產生錯誤的特定行。這就是說,對於像vcard那樣的包含靈活數組成員的結構,不能創建該類型的變量。你只能創建指針變量。例如:

vcard *vc = malloc(sizeof(vcard) + n*sizeof(VcProp));

此時,通過vc->prop[0]vc->prop[n-1]是有效的數組元素(每個具有類型VcProp)。

請注意,靈活的陣列成員是陣列,不是指針

0

對不起大家的困惑。 我想出了我的錯誤。

原因是事情變得古怪是因爲propp是一個輸出指針,而不是輸入指針 我試圖使用Vcard-> prop作爲傳遞參數,當我實際上只需創建自己的,併發送它的地址。