以32位Linux操作系统为例:
如下图:
操作系统给每一个程序都分配了4G的虚拟地址空间,(2^32 = 4,294,967,296),其中内核地址空间为1G,用户地址空间为3G。
在用户地址空间中,从高地址向下分别有环境变量区域,命令行区,栈(Stack),内存映射区,堆(Heap),BSS区(未初始化数据区),初始化数据区,和代码区。
其中栈是由高地址向下增长,堆是由低地址往上增长。
简图如下:
堆里面的数据主要是通过malloc和free管理,(在C++中是new和delete)。
栈里面存放的是函数的返回地址,局部变量,栈顶的位置等信息。
操作系统给每一个程序分配的栈空间是有限的,一般为8MB或者10MB字节,所以需要在写代码时注意,如果局部变量分配的过大,或者函数调用太深,有可能会导致栈溢出,程序崩溃。
领取专属 10元无门槛券
私享最新 技术干货