Когда Malloc памяти для структур, возвращаемых указателем? - PullRequest
2 голосов
/ 08 февраля 2011

Я работаю над заданием, и мой профессор дал нам прототипы функций для всего, что мы должны использовать, а также определения структуры.

Целью программы является чтение файлов .vcf (vCard).

У нас есть функция readVcFile, которая вызывает readVcard, которая вызывает соответствующие функции для чтения каждой строки и ее анализа.

Вот соответствующие прототипы функций для моего вопроса:

VcStatus readVcFile( FILE *const vcf, VcFile *const filep );
VcStatus readVcard( FILE *const vcf, Vcard **const cardp );
VcStatus getUnfolded( FILE *const vcf, char **const buff );

Что мне трудно понять - это когда выделять память. Из того, что я понимаю, большинство указателей должно быть способом возврата значения. Например, я выяснил, что getUnfolded берет указатель на строку и использует этот указатель для заполнения строки теми символами, которые были в строке.

У меня больше проблем с readVcard.

Помните, что readVcFile вызывает readVcard, и в файле vcf может быть несколько vcards, поэтому он может вызывать несколько раз. Теперь мой вопрос, когда (и как) я должен Malloc vCard. Должен ли я malloc перед вызовом readVcard? И как мне получить доступ к этой vcard, когда я нахожусь в readVcard?

Это все очень запутанно, поэтому я ценю любые попытки прояснить для меня вещи.

Спасибо.

Редактировать: если это помогает, размер vcards может варьироваться, поэтому мне нужно использовать malloc.

1 Ответ

2 голосов
/ 08 февраля 2011

(Я предполагаю, что вы должны использовать эти функции, а не писать их. Пожалуйста, уточните свой вопрос, если я ошибаюсь.)

Обратите внимание, что перед аргументом readVCard() cardp стоит две звездочки. Это означает, что вызывающая сторона предоставляет указатель на указатель , который является еще одним способом сообщить readVcard(), что он должен создать указатель на результирующий Vcard и назначить его любому указателю, который предоставляет вызывающая сторона. Этот метод обычно используется, когда функция выделяет память, а вызывающая сторона отвечает за ее освобождение:

Vcard *card;
VcStatus status = readVcard(file, &card);

/* card now points at a newly-allocated Vcard */

if ( status == WHATEVER_THE_VALUE_IS_FOR_SUCCESS ) {
  /* ... Do something with the card ... */
  free(card);
}

Профессор должен был предоставить документацию о том, как должна вести себя функция, и в ней должно быть что-то с эффектом "устанавливает cardp указатель на память, выделенную для хранения результирующей структуры Vcard, если читать удалось. " Если этот бит информации отсутствует, отправьте задание обратно и запросите более полную документацию. (И если это профессор CS, два недостатка для небрежной практики!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...