1.内存区域有哪些?
答:内存区域通常分为5大区域,分别是存储函数的代码区,存储不变常量的常数区,存储全局变量和静态static变量的全局/静态区,还有堆区和栈区。通常来讲,代码区是低地址的,栈区是高地址的。
2.什么样的变量在栈区?
答:一般是临时性的局部变量,再调用函数时会在栈中创建出临时变量,在执行完毕后会自动回收掉。一般更长久的变量会存放在堆区,并且需要手动回收。
3.堆区与栈区的特性是什么?
答:从空间大小来看,堆区的空间较大,栈区的空间较小。生长方向他们是相向生长的。分配方式和管理方式;栈区是自动分配和自动回收的。而堆区是手动分配和手动回收的。从分配效率来看,栈区是在调用函数的时候直接自动分配出来的;而堆区是要执行malloc和calloc时分配的,也就是相当于手动分配,所以栈区的效率更高。堆区可能会产生碎片,所以需要手动进行回收,而栈区则不会。
4.堆区不释放的后果会怎样?
答:会产生碎片,在堆积到一定程度时可能会导致程序崩溃,所以我们通常会在栈区创建一个指针,来指向堆区中内容的地址。在使用后通过free指针来进行空间释放,并且要使指针指向空(NULL),避免后续的操作问题。