【问题标题】:Flexible Arrays in C99C99 中的灵活数组
【发布时间】:2011-06-17 14:30:51
【问题描述】:

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

我有一个函数叫

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

【问题讨论】:

    标签: c arrays malloc structure realloc


    【解决方案1】:
    Vcard *getcards(int n) {
      Vcard *c = malloc(sizeof(Vcard) + sizeof(VcProp) * n);
      c->nprops = n;
      return c;
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2014-07-29
          • 2011-07-25
          • 1970-01-01
          • 2014-04-27
          • 1970-01-01
          • 1970-01-01
          • 2020-10-12
          • 2011-03-04
          • 1970-01-01
          相关资源
          最近更新 更多