2011-02-08 46 views
2

我正在做一個任務,我的教授給了我們所有我們應該使用的函數原型以及結構定義。何時malloc內存指針返回的結構?

該程序的目的是讀取.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。在我打電話給readVcard之前,我是否使用malloc?一旦我在readVcard中,如何訪問該vcard?

這一切都很混亂,所以我很欣賞任何爲我澄清事情的嘗試。

謝謝。

編輯:如果有幫助,vcards的大小可以變化,所以我需要使用malloc。

+0

我們無法確定沒有更多信息,但是您不一定必須使用malloc。這取決於您是否事先知道數據的大小,或者是否足以只選擇一個任意數字作爲最大值 – Falmarri 2011-02-08 15:40:01

+0

我將對此進行編輯。但我需要malloc,因爲vCard的大小各不相同。還有哪些其他信息特別適合您? – Blackbinary 2011-02-08 15:40:50

回答

2

(我要去你的任務是要使用這些功能,不寫他們的假設,請澄清你的問題,如果我錯了。)

注意,有星號之前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教授,馬虎練習有兩個缺點!)