美文网首页
存储的空间的分配和释放

存储的空间的分配和释放

作者: 我不白先生 | 来源:发表于2020-09-10 09:34 被阅读0次

    1.变量(存储空间)的分配与释放

    1.1分配(也被称为声明或定义):将变量名与内存中的若干个字节形成私有关系
    1.2释放:变量名与其私有的若干个字节不在保持私有关系
    2.作用域:变量起作用的范围
    2.1局部变量:定义在函数体(复合语句)内的变量
    2.2全局变量:定义在函数体外的变量
    2.3局部变量与全局变量同名时,全局变量不起作用
    3生命周期:变量从分配存储空间(诞生)到存储空间被释放(死亡)之间的时间
    3.1auto关键字(默认的):告诉编译器为局部变量
    3.2static(静态)关键字

    • 如果static加载方法外面 那么该全局变量只有本文件可以使用
    • 如果static加载方法内 那么该全局变量只有方法可以使用
      3.2.1判断该变量是否分配了存储空间
      3.2.1.1如果没有空间,则给变量分配
      3.2.1.2如果已经有空间,则什么都不做
      3.2.2该变量所在的方法函数体结束时,static阻止释放该变量
      3.2.3static延长局部变量的生命周期,到整个程序结束。但是不会改变变量的作用域局部位置
    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UILabel *outputLabel;
    -(void)method1:(NSMutableString *)str;//形参是一个指针,指向一个字符串变量
    -(void)method2;
    -(void)method3:(NSMutableString *)str;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        [self method2];
    }
    -(void)method1:(NSMutableString *)str
    {
        auto int n = 1;
        [str appendFormat:@"%d\n",n];//拼接字符串变量
        n++;
    }
    -(void)method2
    {
        NSMutableString *str = [NSMutableString string];//将一个空字符串赋值给字符串变量str
        for(int i = 0;i < 5;i++)
        {
            [self method3:str];
        }
        self.outputLabel.text = str;
    }
    -(void)method3:(NSMutableString *)str//实参传给形参
    {
        static int n = 1;
    //    if(变量n没有存储空间)
    //    {
    //        给变量n分配存储空间,并初始化
    //    }
        [str appendFormat:@"%d\n",n];//拼接字符串变量
        n++;
    }
    @end
    
    auto与static区别.png
    auto与static的区别2.png

    4进程空间
    4.1进程:正在运行的可执行文件
    4.2进程空间:进程所使用的所有内存(字节)


    进程概念.png

    4.2.1代码区:程序的源代码、常量(只读)
    4.2.2全局区:全局变量、静态变量
    4.2.3栈区:局部变量、形参

    • 特点后进先出
      4.2.4堆区:程序员向操作系统申请的变量
      4.2.4.1alloc:向堆空间申请变量
      4.2.4.2free:将申请的变量换回给堆空间
      4.2.4.3如果不使用free否则内存泄漏。
    typedef struct
    {
        int x;
        double d;
    }Data;
    #define PRINT(T,x) self.outputLabel.text = [NSString stringWithFormat:@"%"#T,x];//@“%”#T表示为@“%T”,假如#T"%"表示为@“T%”
    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UILabel *outputLabel;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        int a = 10;
        int *p =&a;
        PRINT(d, *p);
        
        p = (int*)malloc(sizeof(int));//向堆空间申请一个整型变量
        *p = 20;
        PRINT(d, *p);
        NSLog(@"-->%d",a);
        free(p);
        
        float *pf = (float*)malloc(sizeof(float));
        *pf = 3.14;
        PRINT(g, *pf);
        free(pf);
        
        double *pd = (double*)malloc(sizeof(double));
        *pd = 3.148;
        PRINT(f, *pd);
        free(pd);
        
        char *pch = (char*)malloc(sizeof(char));
        *pch = 'a';
        PRINT(c, *pch);
        free(pch);
        
        BOOL *pb = (BOOL*)malloc(sizeof(BOOL));
        *pd = NO;
        PRINT(d, *pb);
        free(pb);
        
        Data data1 = {10,3.14};
        PRINT(d, data1.x);
        Data *pData = &data1;
        PRINT(d, (*pData).x);//一般编程的时候写下面那种
        PRINT(d, pData->x);//->是指针操作结构体变量的成员变量时的成员运算符
        
        pData = (Data*)malloc(sizeof(Data));
        pData->x = 20;
        pData->d = 3.14;
        PRINT(g, pData->d);
        free(pData);
        
    }
    

    相关文章

      网友评论

          本文标题:存储的空间的分配和释放

          本文链接:https://www.haomeiwen.com/subject/nbqeektx.html