我们编译的二进制代码就放在代码区,而我们malloc的内存,全局变量等,就放在数据区,而函数的参数以及函数的局部变量,就放在堆栈区。之所以函数的参数和函数的局部变量放在堆栈区,是因为函数执行完毕后,需要有一个弹栈的过程,也就是这些东西是局部的,函数一运行完,将会随之消失。函数堆栈是层层分配的,调用了一个函数后,会将返回点压栈,新调用的函数紧跟着分配栈空间,等这个函数执行完毕后,将会取出返回点的指令。如果函数调用非常深的话,会导致堆栈溢出,也就是不推荐使用递归算法。C语言中,我们malloc的内存,是不负责回收的,是统一放在一个叫堆的地方,所以如果我们不free的话,将会内存泄漏。当然,以上的观点只是针对代码级来说,对于操作系统,对进程的内存会统一回收,此是后话。操作系统的堆栈是怎么回事呢?我们一定听过系统调用,软中断等词语,操作系统有自己的堆栈,是不允许任务随便访问的,只要调用操作系统提供的函数,这时控制权将交由操作系统接管,进行后续的操作。