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

存储的空间的分配和释放

作者: 我不白先生 | 来源:发表于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