Гибкие массивы в C99 - PullRequest
       19

Гибкие массивы в C99

0 голосов
/ 29 января 2011

ПРИМЕЧАНИЕ. Я переписал исходный вопрос, чтобы сделать его более понятным.

У меня есть функция с именем

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

Ответы [ 3 ]

3 голосов
/ 29 января 2011
Vcard *getcards(int n) {
  Vcard *c = malloc(sizeof(Vcard) + sizeof(VcProp) * n);
  c->nprops = n;
  return c;
}
2 голосов
/ 29 января 2011

Вам действительно нужно показать нам конкретную строку, которая выдает ошибку.

С учетом сказанного для структуры типа vcard, содержащей элемент гибкого массива, вы не можете создавать переменные этого типа.Вы можете создавать только переменные указателя.Например:

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

На данный момент vc->prop[0] - vc->prop[n-1] являются действительными элементами массива (каждый имеет тип VcProp).

Обратите внимание,членом гибкого массива является массив , , а не указатель .

0 голосов
/ 29 января 2011

Извините за путаницу всех.Я понял свою ошибку.

Причина, по которой все пошло странно, заключается в том, что propp - это выходной указатель, а не входной указатель. Я пытался использовать Vcard-> prop в качестве передаваемого аргумента, когда мне просто нужно было создать свой собственный и отправитьадрес этого.

...