在学习C/C++编程的时候,老师都会反复灌输一些概念。比如程序内变量在堆栈上的分配,栈是由高地址到低地址,堆是由低地址到高地址等等,然后画出这样一幅经典概念图:
图片来自:http://blog.csdn.net/wind19/article/details/5964137
这个概念图容易让读者误认为这一大段的程序在具体分配到的物理内存上面是连续的。换句话说,整个程序在加载到内存之后就已经固定了大小,而且程序的不同段的是紧挨着的。
而实际上,堆上面分配的内存是灵活而通常不连续的,对某个正在运行的程序而言,属于它的堆和栈更不是紧挨着的。来一幅更细致的示意图:
图片来自: http://www.jianshu.com/p/aad2b27992eb
在广阔的地址空间下面,操作系统的内核占领了高地址的空间,极低的地址空间被保留,比如NULL。
对于用户的普通程序,则会分为5部分,如经典示意图所示,静态数据段(初始化和未初始化)和代码段在最低的地址,堆和栈一低一高,向中间“生长”。