C99中的灵活阵列

时间:2011-01-29 01:57:58

标签: c arrays malloc structure realloc

注意:我已经写了原始问题,以便更清楚。

我有一个名为

的函数
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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

你真的需要告诉我们产生错误的特定行。

话虽如此,对于包含灵活数组成员的vcard结构,您无法创建该类型的变量。您只能创建指针变量。例如:

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

此时,vc->prop[0]vc->prop[n-1]是有效的数组元素(每个元素都有VcProp类型。)

请注意,灵活的数组成员是数组不是指针

答案 2 :(得分:0)

对不起大家的困惑。 我想出了我的错误。

事情变得古怪的原因是因为propp是输出指针,而不是输入指针 我试图使用Vcard-> prop作为传递参数,当我实际上只需创建自己的,并发送它的地址。

相关问题