周立功教授数年之心血之作《程序设计与数据结构》以及《面向AMetal框架与接口的编程(上)》,书本内容公开后,在电子行业掀起一片学习热潮。经周立功教授授权,本公众号特对《程序设计与数据结构》一书内容进行连载,愿共勉之。
第二章为程序设计技术,本文为2.3 栈与函数返回。
当函数执行完毕后,如何返回调用处呢?由于该函数可能会被多次调用,且每次调用的地方很可能不一样,这样被调用函数也就不可能知道自己该返回到哪里,因此在调用函数时必须告诉被调用函数应返回到哪里?
>>>2.3.1 堆栈
为了保存变量(数据),通常计算机会提供非常多的内存。为了便于管理内存,将所有变量使用的内存称为栈,而将未分配的内存区域称为堆。这些未分配的内存区域,程序员可以块为单位请求它。这部分内存是由操作系统管理的,一旦一块内存被分配出去,它只能由分配了这块内存的原始代码使用,并使用指针访问这块内存。由于内存是稀缺资源,当程序不再需要该内存时,都应该释放回去。如果不这样做,程序将会耗光内存,导致运行速度下降甚至崩溃。这就是因为程序员没有释放本应释放的内存,造成了所谓的内存泄漏。
堆和栈是两种常用的数据结构,主要用于数据的动态存储。当程序执行时,栈中存储的是程序的执行过程,比如,main()函数的局部变量argc和argv都在栈中,而使用malloc()函数动态分配的内存是存储在堆中的,堆栈共享同一块内存区域。通常程序栈占据这块区域的下部,而堆用的是上部。当调用函数时,函数的栈帧被推到栈上,栈向上“长出”一个栈帧。当函数终止时,其栈帧从程序栈弹出。虽然栈所使用的内存不会被清理