从 malloc 存储 return 值(空指针)

Storing return values (void pointers) from malloc

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

此功能迫使我保持​​分配给每个文件的内存完好无损,同时打开新文件——因此分配新的内存束,并继续解析它们直到最后一个文件被打开并且最后一行被解析,并且然后我就可以开始free从最后打开的文件开始清理内存了。

我首先想到的是实施 Stack 来跟踪分配的内存。当我这样做是为了学习 C 时,我开始阅读如何存储从 malloc 返回的指针,但是围绕 "how to cast malloc" 等类似主题有很多噪音我找不到任何有用的东西。

然后我查看了malloc文档,里面说malloc returns void指针,但是据我所知一般不推荐使用void指针,因为您不能取消引用 void 指针。

我认为我不需要取消引用 malloc 指针,因为我只需要将它们传递给 free 就可以了,但是我想知道是否有任何关于将这些指针正确存储在我的堆栈中的众所周知的解决方案?

目标只是通过堆栈跟踪分配的内存,因此在需要时可以随时弹出并释放指向最近分配的内存的指针。

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

底线 - 就 malloc 而言,存储指针的方法没有正确或错误之分 returned... 这完全取决于您打算如何处理内存;解决方案的设计将决定处理指针的最佳方法。

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

如果您遇到问题,因为块是不同的类型,您可以查看匿名 structs/unions(自 C99 起),它允许一些基本的 class-推导,因此您可以存储对象并稍后处理它们而不进行铸造。如果使用 gcc,您可能还会发现 -fplan9-extensions 非常吸引人(我喜欢它们!)。如果使用得当,这将大大提高类型安全性。但请注意,您将离开 ISO 路径! (不过,要用力)。