何时为指针返回的结构调用malloc内存?

何时为指针返回的结构调用malloc内存?,c,pointers,malloc,C,Pointers,Malloc,我正在做一项作业,我的教授给了我们所有我们应该使用的功能原型,以及结构定义 该程序的目的是读取.vcf(vCard)文件 我们有一个函数readVcFile,它调用readVcard,它调用适当的函数来读取并解析每一行 以下是与我的问题相关的功能原型: VcStatus readVcFile( FILE *const vcf, VcFile *const filep ); VcStatus readVcard( FILE *const vcf, Vcard **const cardp ); Vc

我正在做一项作业,我的教授给了我们所有我们应该使用的功能原型,以及结构定义

该程序的目的是读取.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 );
我搞不清楚的是什么时候分配内存。 据我所知,大多数指针都应该是返回值的一种方式。 例如,我算出了getUnfolder,它使用指向字符串的指针,并使用该指针用行中的任何字符填充字符串

我遇到更多麻烦的是readVcard

请记住,readVcFile调用readVcard,并且一个vcf文件中可能有多个vCard,因此它可能会多次调用。现在我的问题是,我应该在什么时候(以及如何)购买vCard。在我打电话给readVcard之前,我是否要先登录malloc?我进入readVcard后如何访问该vcard

这一切都非常令人困惑,所以我感谢任何为我澄清事情的尝试

谢谢

编辑:如果有帮助,vCard的大小可能会有所不同,因此我需要使用malloc。

(我假设您的任务是使用这些函数,而不是编写它们。如果我错了,请澄清您的问题。)

请注意,
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教授,那么草率的练习有两个缺点!)

如果没有更多的信息,我们无法确定,但你不一定要做任何事情。这取决于您是否事先知道数据的大小,或者是否足以选择任意数字作为最大值。我将对此进行编辑。但我需要malloc,因为vCard的大小不同。你还特别想要什么其他信息呢?既然readVcard只由readVcard调用,我想你不必对它进行任何malloc操作。那么BlackBear,readVcard怎么知道readVcard的内容呢?你是在建议我在readVcard中使用malloc吗?@Blackbinary(nice name=P):我误解了你的问题,我以为你已经有了这些函数。我确实需要编写这些函数,但它们必须遵循那些原型。我想你发现了我逻辑上的缺陷。我假设VcFile函数将声明卡类型的Vcard,而不是指针。这很好地解决了问题,因为我意识到VcFile真正需要从vcard获得的唯一东西是它的地址,这样它就可以将它添加到数组中。