簡體   English   中英

C99中的靈活陣列

[英]Flexible Arrays in 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)嗎?

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

您確實需要向我們展示產生錯誤的特定行。

話雖如此,對於像vcard這樣的包含靈活數組成員的結構,您無法創建該類型的變量。 您只能創建指針變量。 例如:

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

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

請注意,靈活數組成員是數組而不是指針

抱歉給大家帶來混亂。 我發現了我的錯誤。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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