32

我刚开始阅读Brian Kernighan 和 Dennis Ritchie的 The C Programming Language,我发现了这个语句:

除了静态定义和函数的局部变量提供的堆栈规则之外,该语言没有定义任何存储分配工具;没有堆或垃圾收集。

那么这是否意味着由于malloc()函数从堆中返回一些内存地址,C 才喜欢访问堆内存?然后必须malloc用其他语言编写,很可能是汇编还是B?

这可能是一个愚蠢的怀疑,但我必须清除它。谢谢。

4

4 回答 4

30

C语言本身并没有直接指定堆或它应该如何工作,但确实提供了指针等。

malloc它的表兄弟是 C 标准库的一部分,并且是与 C 的任何标准实现链接的函数,它们确实提供对非静态或堆栈上的内存的访问。在每个平台上,这些函数实际获取和管理内存的方式可能不同。

C 是一门久负盛名的语言和库,现在它们似乎是一个整体。但是当 K&R 编写那本书时,这并不是那么明显,并且该声明澄清了属于语言本身的语法(相对于支持库通常提供的)。

于 2012-08-21T16:21:43.333 回答
6

我认为作者在谈论“语言”时非常准确。当您谈论 C 时,您拥有语言和标准库。在语言本身中,没有动态内存分配工具,但标准库提供了这些工具。

于 2012-08-21T16:22:10.373 回答
3

语言中没有明确定义堆。但是,实现确实将它用于动态分配的内存。

请参阅有关各种分配的讨论,包括堆:

http://en.wikipedia.org/wiki/C_dynamic_memory_allocation

于 2012-08-21T16:21:01.340 回答
2

malloc 从操作系统内核获取分配给它的内存。所有语言都这样做。这就是操作系统如何确保程序有可用空间的方式,尽管它不会或可能不会阻止它们,尤其是那些用 C 编写的程序,试图超越任何限制。

于 2012-08-21T16:19:22.470 回答