从malloc

时间:2015-05-09 21:03:39

标签: c pointers memory-management malloc void-pointers

如何存储pointer返回的malloc?我有一个小的解析器,允许在源文件中嵌套include,这意味着第一个源文件可以包含foo,然后foo可以包含bar,依此类推。

此功能强制我保持分配给每个文件的内存不变,同时打开新文件 - 因此分配新的内存串,并继续解析它们,直到打开最后一个文件并解析最后一行,然后我可以从最后打开的文件开始free内存。

首先我想到的是实现一个 Stack 来跟踪分配的内存。当我这样做是为了学习C时,我开始阅读如何存储来自malloc的返回指针,但是围绕类似主题的声音太多,比如“如何施展{{ 1}}“我找不到任何有用的东西。

然后我检查了malloc文档,它说malloc返回malloc指针,但据我所知,一般不建议使用void指针,因为你不能dereference void pointers。

我认为我不需要取消引用void指针,因为我只需要将它们传递给malloc我会没事的,但我想知道是否有任何好的指针 - 关于在我的堆栈中正确存储这些指针的已知解决方案?

目标只是通过堆栈跟踪分配的内存,因此在任何时候,指向最近分配的内存的指针都可以加速并在需要时释放。

2 个答案:

答案 0 :(得分:2)

当你使用malloc时,你要求一大块内存,你打算存储一些东西。 malloc函数是通用的,既不知道也不关心你打算在它给你的内存中存储什么类型的对象。指向void( void * )返回类型是malloc通用性的表现形式。例如,如果内存包含很长的字符串,则可以选择将指针接受为 char * 类型的变量。强类型会强制您明确地将 void * 强制转换为 char * 。如果你想创建一堆指针,那么 - 继续这个例子 - 你将拥有一堆 char * 项。 free函数接受一个指向void的指针( void * ),但是转换规则表明指向任何东西的指针可以隐式地转换为指向void的指针,因此你可以简单地传递 char * 指向免费的指针,这一切都很好。

底线 - 就malloc而言,没有正确或错误的方法来存储它返回的指针......这一切都取决于你打算用内存做什么;解决方案的设计将决定处理指针的最佳方法。

答案 1 :(得分:1)

您不得取消引用void *或在带有强制转换的表达式中使用它们。但是你可以将它们存储为其他指针。但是,我怀疑您已将它们分配给MyType *myptr = malloc(...)之类的内容,那么为什么不将它们存储为MyType *?但是,如果你有一个解析器并且实际上不再需要内存(这实际上就是你所写的内容),为什么你想要保留内存呢?尽快释放它会更有效率。而且你不需要额外的结构。

如果您遇到问题,因为块是不同的类型,您可能会看一下匿名结构/联合(自C99),它允许一些基本的类派生,因此您可以存储对象并在以后处理它们而不进行强制转换。如果使用gcc,您可能还会发现-fplan9-extensions非常吸引人(我喜欢这些!)。如果使用得当,这将大大提高型号的安全性。但请注意,您将离开ISO路径! (但是,使用武力)。