Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C99中的灵活阵列_C_Arrays_Malloc_Structure_Realloc - Fatal编程技术网

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作为传递参数,但实际上我必须创建自己的,并发送它的地址