C 内存管理初步了解

时间:2023-03-09 06:26:55
C 内存管理初步了解

1 首先变量了解几个概念

  静态变量:用 static 修饰的变量

  局部变量: 存储在栈区;作用域是函数块内;生存期是直到函数块结束

  全局变量:存储在静态区;作用域是从定义到本源程序结束,生存期是运行期间

  静态全局变量:存储在静态区;作用域是函数块内;生存期是运行期间

  静态局部变量:存储在静态区;作用域是从定义到工程源程序结束;生存期是运行期间

2 内存的分区:一般为5大分区,栈区,堆区,静态区,常量区,代码区(内存地址从高到底)

  栈区:

    *函数参数以及局部变量存储的区域

    *栈区的存储空间由高向低分配,由低向高存储

    *栈区的内存由系统负责分配和回收,开发者没有权限,定义局部变量时由系统分配空间,局部变量被销毁时,由系统回收存储空间,但是存储空间的数值并没有被清空; 

 
   
   

    *栈的特点:先进后出,后进先出。由栈底开始分配内存,栈顶是最后分配内存的位置

    *栈区会存在安全问题,在函数中返回栈内存是不安全的

    *栈区的空间是有限的(7M-8M之间),之所以系统运行不崩溃的原因是:栈区空间在频繁的开辟和释放

  堆区:

    *由开发者自主管理的区域

    *由开发者手动开辟内存,手动释放内存

    *忘记回收会造成内存泄露,从而导致崩溃

    *程序运行结束后会自动回收堆区内存,但是如果不及时回收堆区内存,程序运行期间很有可能是因为内存泄露导致内存被全部占用,程序无法运行。

  静态区:也称全局区、数据区

    *全局变量和静态变量存储的区域

    *当全局变量和局部变量同时出现在同一区域时,全局变量被暂时屏蔽。

    *静态区的存储空间由系统回收和分配    

    *程序运行结束后,静态区的存储空间被回收,静态区变量的生命周期和程序一样长,静态变量的空间只有程序退出才释放

    *静态变量只能初始化一次(在编译时初始化),在程序运行期间可以修改值

    *静态变量如果没有设置初始值,默认值为0

    *静态区分为两部分:一部分存储赋初值的全局变量和静态变量,一部分存储没有赋初值的

  常量区:

    *常量存储常量区

    *常量区内存空间由系统分配和回收

    *程序运行结束后,常量区的存储空间被回收

    *常量区的数据只能被读取,不能被修改(强行修改会导致程序崩溃)

  代码区:

    *所有语句编译的CPU指令存储的区域(函数体的二进制代码)

    *由系统回收和开辟

    *只能读取,不能修改

    *在程序运行结束后,才会自动回收