iOS学习之C语言内存管理

时间:2023-03-10 07:08:03
iOS学习之C语言内存管理

     一、存储区划分

     按照地址从高到低的顺序:栈区,堆区,静态区,常量区,代码区
    1.栈区:局部变量的存储区域
     局部变量基本都在函数、循环、分支中定义
     栈区的内存空间由系统自动分配和回收
     栈顶,栈底:先定义的局部变量的存储区域从栈底开始分配,后定义的局部变量向栈顶分配
     特点:先进后出,后进先出
     当函数、循环、分支结束后,局部变量的生命周期结束,不再被使用,由系统自动回收内存空间
     栈区的内存安全问题:在函数中返回栈区的地址是不安全的

 void test() {
     ;
 }
 void test1() {
     int a;  // 栈区不会清空数据,只会回收内存空间,故输出为上个变量的值
     printf("a = %d\n", a);;
 }
 int main() {
    test();
    test1();
    ;
 }

2.静态区:静态变量和全局变量的存储区域
     静态区的内存空间由系统自动分配和回收
     静态区的变量生命周期和整个程序一样长

 int sumValue(int number) {
     ;
     n++;
     number += n;
     return number;
 }
 int main() {
     ; // 用static修饰的变量成为静态变量
     // 静态变量只能初始化一次
     printf());
     printf());
    ;
 }
     

  3.常量区:常量的存储区域
     内存空间由系统自动分配和回收
    常量区的内容只能读取,不能修改

iOS学习之C语言内存管理

4.代码区:所有的语句编译成二进制指令存放在代码区
    存储空间由系统自动分配和回收
    代码区的内容只能读取,不能修改
    程序执行结束后,代码区的内存空间由系统回收