1 首先变量了解几个概念
静态变量:用 static 修饰的变量
局部变量: 存储在栈区;作用域是函数块内;生存期是直到函数块结束
全局变量:存储在静态区;作用域是从定义到本源程序结束,生存期是运行期间
静态全局变量:存储在静态区;作用域是函数块内;生存期是运行期间
静态局部变量:存储在静态区;作用域是从定义到工程源程序结束;生存期是运行期间
2 内存的分区:一般为5大分区,栈区,堆区,静态区,常量区,代码区(内存地址从高到底)
栈区:
*函数参数以及局部变量存储的区域
*栈区的存储空间由高向低分配,由低向高存储
*栈区的内存由系统负责分配和回收,开发者没有权限,定义局部变量时由系统分配空间,局部变量被销毁时,由系统回收存储空间,但是存储空间的数值并没有被清空;
*栈的特点:先进后出,后进先出。由栈底开始分配内存,栈顶是最后分配内存的位置
*栈区会存在安全问题,在函数中返回栈内存是不安全的
*栈区的空间是有限的(7M-8M之间),之所以系统运行不崩溃的原因是:栈区空间在频繁的开辟和释放
堆区:
*由开发者自主管理的区域
*由开发者手动开辟内存,手动释放内存
*忘记回收会造成内存泄露,从而导致崩溃
*程序运行结束后会自动回收堆区内存,但是如果不及时回收堆区内存,程序运行期间很有可能是因为内存泄露导致内存被全部占用,程序无法运行。
静态区:也称全局区、数据区
*全局变量和静态变量存储的区域
*当全局变量和局部变量同时出现在同一区域时,全局变量被暂时屏蔽。
*静态区的存储空间由系统回收和分配
*程序运行结束后,静态区的存储空间被回收,静态区变量的生命周期和程序一样长,静态变量的空间只有程序退出才释放
*静态变量只能初始化一次(在编译时初始化),在程序运行期间可以修改值
*静态变量如果没有设置初始值,默认值为0
*静态区分为两部分:一部分存储赋初值的全局变量和静态变量,一部分存储没有赋初值的
常量区:
*常量存储常量区
*常量区内存空间由系统分配和回收
*程序运行结束后,常量区的存储空间被回收
*常量区的数据只能被读取,不能被修改(强行修改会导致程序崩溃)
代码区:
*所有语句编译的CPU指令存储的区域(函数体的二进制代码)
*由系统回收和开辟
*只能读取,不能修改
*在程序运行结束后,才会自动回收