注意:我已经写了原始问题,以便更清楚。
我有一个名为
的函数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)?
答案 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作为传递参数,当我实际上只需创建自己的,并发送它的地址。