0

注意:我已经重新编写了原始问题以使其更加清晰。

我有一个名为

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) 吗?

4

3 回答 3

3
Vcard *getcards(int n) {
  Vcard *c = malloc(sizeof(Vcard) + sizeof(VcProp) * n);
  c->nprops = n;
  return c;
}
于 2011-01-29T02:03:20.583 回答
2

您确实需要向我们展示产生错误的特定行。

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

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

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

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

于 2011-01-29T02:03:05.090 回答
0

很抱歉给大家带来了困惑。我发现了我的错误。

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

于 2011-01-29T02:31:30.730 回答