我是CS世界的新手。在读一些书的时候,我检查了内存的动态分配,在程序运行的时候动态分配内存,内存被称为堆。这意味着每当我想在Linkedlist中创建一个新的节点时,它都被存储在堆中?或者存储在内存中并访问运行时?
我还检查了每当运行任何程序时,操作系统都会为同一程序创建PCB,包括至少4个以下部分:
堆段
堆栈段
数据段
代码段
堆段和堆栈段的动态增长取决于代码(向上或向下取决于系统)。
所以我的基本问题是
在系统内存耗尽或堆内存耗尽之前,我们可以在Link表中添加最大的元素吗?
我一直读到系统内存耗尽。但我想知道怎么做?
最佳答案
我读过的最好的解释是:
因为堆的增长和堆的下降,它们基本上是相互限制的。另外,因为这两种类型的段都是可写的,所以其中一个段越界并不总是违规的,所以可能会有缓冲区或堆栈溢出。现在有了阻止它们发生的机制。
每个进程的堆(堆栈)都有一个开始的限制。此限制可以在运行时更改(使用brk()/sbrk())。基本上,当进程需要更多堆空间并且它已经用完分配的空间时,标准库将发出对操作系统的调用。操作系统将分配一个页面,通常由用户库管理以供程序使用。也就是说,如果程序需要1个KiB,操作系统将提供额外的4个KiB,而库将为程序提供1个KiB,并且在程序下次请求更多KiB时还有3个KiB可供使用。
节选自here。
关于c - 链表的最大限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27886285/