虚拟内存和堆

Virtual memory and Heap

早上好。我希望有人能帮助我理解虚拟内存的一个方面是如何工作的以及 C 的行为方式。 据我了解,每当我们调用 malloc 时,C 都会将其添加到堆中,指针向上。如果堆栈和堆相互碰撞,malloc 将 return NULL,因为没有更多的内存可以使用。

我不明白的是,每个程序在调用时都会占用Virtual memory,运行脚本本身的低地址和高地址是确定的。这样,程序就可以使用固定数量的内存。堆是随着 上的数据 增长,还是堆实际上只是一组指向实际数据的指针?如果程序在开始时有一个固定的内存(因为它不能拥有所有内存)对我来说将原始数据存储在堆中是没有意义的,否则我们很容易就会用完可用内存。我错过了什么?

您做出了几个不正确的假设。最重要的一点是,您的程序分配了一块内存,从地址 x 开始,一直到地址 x + 程序大小。事实并非如此,您的程序被分成块(不同的平台给它们起不同的名字)。栈会是一个,堆可能会是几个,代码会在几个等等

当堆管理器用完当前块时,它可以简单地获取另一个块。

另请注意,这与'virtual memory'无关。