我刚开始阅读Brian Kernighan和Dennis Ritchie撰写的 The C Programming Language , 我发现了这句话:
语言没有定义静态定义以外的任何存储分配工具和函数的局部变量提供的堆栈规则; 没有堆或垃圾回收。
这是否意味着它是由于malloc()
函数,它从堆中返回一些内存地址,C是否可以访问堆内存?然后必须用其他语言编写malloc
,最有可能是汇编或B?
这可能是一个愚蠢的怀疑,但我必须清除它。感谢。
答案 0 :(得分:27)
C 语言本身不是直接指定堆或它应该如何工作,而是提供指针等。
malloc
及其表兄弟是C标准库的一部分,是您与C的任何标准实现链接的函数,而那些 do 提供对内存的访问不是静态的或在堆栈上。在每个平台上,这些功能实际获取和管理内存的方式可能不同。
C是一个长期以来的语言和图书馆,现在看起来它们都是一块。但是当K& R写这本书时,那并不是那么明显,而且这句话澄清了语言本身的语法(与支持库通常提供的内容相比)。
答案 1 :(得分:6)
我认为作者在说他们谈论“语言”时非常精确。当你谈到C时,你有语言和标准库。在语言本身中,没有动态内存分配工具,但标准库提供了这些功能。
答案 2 :(得分:3)
语言中没有明确定义堆。但是,实现会将其用于动态分配的内存。
参见这种对各种分配的讨论,包括堆:
答案 3 :(得分:2)
malloc从操作系统的内核获取分配给它的内存。所有语言都这样做。这就是操作系统如何确保程序具有可用空间的方式,尽管它不会或不会阻止它们,特别是那些用C语言编写的程序,试图超出任何限制。