C99中的灵活阵列
注:我重新编写了原始问题,以使其更加清楚 我有一个函数叫做C99中的灵活阵列,c,arrays,malloc,structure,realloc,C,Arrays,Malloc,Structure,Realloc,注:我重新编写了原始问题,以使其更加清楚 我有一个函数叫做 VcStatus readVcard( FILE *const vcf, Vcard **const cardp ) vcf是一个打开的文件,我将读取它,而cardp是一个指向一系列卡片开头的指针。 一个文件将包含多张卡片 readVCard一次读取一行文件,并调用函数parseVcProp来识别行中的关键字,并将它们分配到结构中的适当位置 这里是结构 typedef struct { // property (=conten
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
这样包含灵活数组成员的结构,您不能创建这种类型的变量。只能创建指针变量。例如:
vcard*vc=malloc(sizeof(vcard)+n*sizeof(VcProp))代码>
此时,vc->prop[0]
到vc->prop[n-1]
是有效的数组元素(每个元素都有类型VcProp
)
请注意,灵活数组成员是数组,而不是指针您确实需要向我们显示产生错误的特定行
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
)
请注意,灵活数组成员是数组,不是指针很抱歉让大家感到困惑。
Vcard *getcards(int n) {
Vcard *c = malloc(sizeof(Vcard) + sizeof(VcProp) * n);
c->nprops = n;
return c;
}
我发现了我的错误
事情变得古怪的原因是因为propp是一个输出指针,而不是一个输入指针
我试图使用Vcard->prop作为传递参数,但实际上我必须创建自己的,并发送它的地址。很抱歉让大家感到困惑。
我发现了我的错误
事情变得古怪的原因是因为propp是一个输出指针,而不是一个输入指针
我试图使用Vcard->prop作为传递参数,但实际上我必须创建自己的,并发送它的地址