13rd

这张图是 MIPS 分配内存的约定。栈由内存高端开始并向下增长。内存低端的第一部分是保留的,之后是代码段,存储程序指令,程序计数器中存的便是这部分内存的地址;代码段之上是静态数据段,是存储常量和其他静态变量的空间。再往上是动态数据区,习惯上称为堆,在程序运行中如果需要动态申请内存,就是在这个区域内给程序分配内存。堆和栈的大小是不固定的,他们两个相互增长,在此消彼长的过程中达到高效的使用。

C 语言通过显式的函数调用在堆上分配和释放空间,malloc() 在堆上分配空间并返回指向它的指针,free() 释放指针指向的堆空间。内存分配完全由 C 程序控制是很多错误产生的根源,忘记释放空间会导致“内存泄漏”,它会逐渐耗尽大量内存以至于操作系统可能崩溃,而过早地释放空间会导致“悬摆指针”(dangling pointer),会造成指针指向程序不想访问的位置。Java 的自动内存分配和垃圾回收机制避免了类似错误的发生。

MIPS分配内存的约定

Last updated

Was this helpful?