2011-01-29 8 views
0

注:元の質問を書いて、はっきりさせるようにしました。C99でのフレキシブルアレイ

は、私は読みます開いているファイル

VcStatus readVcard(FILE *const vcf, Vcard **const cardp) 

VCFであると呼ばれる機能を持っている、とcardpは、カードの配列の先頭へのポインタです。 ファイルには複数のカードが含まれます。

readVCardは、ファイルを一度に1行ずつ読み込み、関数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)ですか?

答えて

3
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[n-1]スルーvc->prop[0]は、有効な配列要素(それぞれVcPropを入力している)です。

フレキシブルアレイメンバはの配列,のポインタではありません。

0

ご迷惑をおかけして申し訳ありません。 私は自分の誤りを理解しました。

なぜなら、proppは入力ポインタではなく出力ポインタであるからです。 私は実際に自分自身を作成し​​て送信する必要があったときにVcard-> propを渡す引数として使用しようとしていました。それのアドレス。