• C:内存分配、内存中五大区


     1.内存的划分  (从高到低依次是: 栈区 堆区全局静态区 、 常量区代码区 )栈区是系统自动回收,堆区是我们手动回收 

     2栈区   在函数内部定义的局部变量和数组、都存放在栈区,栈区的内存空间是由系统管理,函数调用的时候开辟空间,函数调用结束,空间就被回收

     3.堆区   由我们手动来(管理)开辟,手动回收

     4.全局静态区   存放全局变量和静态变量。空间是由系统管理。(函数外部定义的变量,在定义的时候,这个空间就已经被开辟了)程序开始执行时开辟空间,程序结束执行时回收空间,程序执行期间一直存在。

    for (int i = 0; i < 5; i++) {
            static int a = 0; //static 修饰的变量仅被初始化一次
            printf("%d",a++);
        }
      static 修饰的变量只初始化一次

    对于static修饰的变量 有三个特点:

    (1)仅仅初始化一次  

    (2)如果没有给初始值的话,那就默认给为 0    

    (3)生命周期:一旦给定一个 static 变量,他的生命周期就是在程序的整个运行期间

     5.常量区  存放常量。整型常量,字符型常量,浮点常量,字符串常量。 在整个的程序运行期间不能被改变。 空间是由系统管理的,生命周期,在程序运行期间一直存在(与程序的生命周期一样)

     6.代码区  存放程序执行的CPU指令,我们的代码最后在编译的时候都会转化为相应的CPU指令,告诉计算机如何执行程序

    //    char *string  ="iphone";//栈区
    //    string[0] = 'a';//程序将崩溃 因为常量区不能被修改 会直接crash

    malloc(size_t)函数 在堆区开辟 size 个字节的空间,并把首地址返回

    malloc 和 alloc 函数区别 参考

    define 与 const 的区别  参考    

        char *p = malloc(10);//堆区开辟10个字节的空间
        strcpy(p, "iphone");//在对应的空间赋值一个“iphone”字符串
        printf("%c
    ",*(p+1));
        printf("%s
    ",p+1);//从第二个字母开始后面的字符串
        printf("%s
    ",p);//根据字符串的首地址去打印字符串
        printf("%p
    ",p+1);//找第二个字母的位置
        free(p);//根据p的首地址,手动去释放我们自己建立使用的堆空间,只是标记删除,不清除内容
        printf("%s
    ",p);
        p = NULL;//洗碗,下次我们再使用的时候,更加的准确,安全
      malloc 函数的使用 与 释放
    char *p = malloc(10);//堆区开辟10个字节的空间
        strcpy(p, "iphone");//在对应的空间赋值一个“iphone”字符串
        printf("%c
    ",*(p+1));
        printf("%s
    ",p+1);//从第二个字母开始后面的字符串
        printf("%s
    ",p);//根据字符串的首地址去打印字符串
        printf("%p
    ",p+1);//找第二个字母的位置
        free(p);//根据p的首地址,手动去释放我们自己建立使用的堆空间(p指向是空间),只是标记删除(只是释放掉了空间),p的内容不清除内容,在内存里
        //free(p)就是开房之后,要退房了,p = NULL;就是交还房间的钥匙。malloc初始化的时候,就是开房的例子,如果没有 p = NULL;将会有野指针问题
        // malloc 与 free 只能成对出现,free 如果过度释放,就会造成程序立即crash(崩溃)
        printf("%s
    ",p);
        strcpy(p, "哦哦哦");
        printf("%s
    ",p);
        p = NULL;//洗碗,下次我们再使用的时候,更加的准确,安全
        printf("%s
    ",p);
     free 的注意问题

     其他内存分配函数

    calloc函数 :       calloc(n 个size大小的空间, size);分配n 个size 大小的内存空间,比 malloc(<#size_t#>)多了一功能:清零的操作,但是效率低 ,不常用

    realloc函数         作用是在,realloc(起始地址, newSize)  内存从新分配函数 按照给定的 newSize 大小重新分配空间

    内存的操作函数:  memset(给定的开始地址, n, size);    给定的地址作为开始的地址,从这个地址开始将 size 字节的数据初始为 n,  size 的单位是 字节

                             memcpy(拷贝目的地址的指针, 源地址, size);  将源地址的数据里 size 个大小 拷贝到 目的地址指向的内存中

                             memcmp(目的地址, 源地址, size );内存比较函数  就是为给定的 目的地址 源地址 开始的内存里 取 size 个数据相比较大小,返回类型为 int

        int * p11 = malloc(sizeof(int) * 3);
        *(p11 + 0) = 1;
        *(p11 + 1) = 2;
        *(p11 + 2) = 3;
        int * p12 = alloca(sizeof(int) * 3);
        *(p12 + 0) = 1;
        *(p12 + 1) = 2;
        *(p12 + 2) = 3;
        memset(p11, 0, 3);
        for (int i = 0; i < 3; i++) {
            *(p11 + i) = arc4random() %(3 - 1 + 1) + 1;
            printf("%d ",*(p11 + i));
        }
        printf("
    ");
        for (int i = 0; i < 3; i++) {
            printf("%d ",*(p12 + i));
        }
        printf("
    ");
        int v = memcmp(p11, p12, sizeof(int) * 3);
        if (v == 0) {
            printf("YES 
    ");
        }else{
            printf("NO 
    ");
        }
        free(p11);//这里不用再释放 p12 了,因为在上面已经释放了 calloc有清零功能
        p11 = NULL;
    View Code   内存稻作函数的使用 demo

    堆区一定要注意的三个问题: 野指针 、内存泄露 、 过度释放  

    malloc一定要和 free 配对使用

    const  是C的关键字。const 修饰的变量就相当于是个常量,在程序运行期间不能再被修改。

    常量与变量的区别::常量在运行期间不可以被改变,变量在程序的运行期间是可以被改变的,一旦被 const 修饰的变量 他就变成了一个不可以被修改的常量,相当于常量来使用

    int a1 = 0, b1 = 0;
    //    const int *p1 = &a1;  *p1 是不可以被改变的
    
    //    int * const p1 = &a1;   //p1 是不可以被改变的
    const int * const p1 = &a1; // p1 与 *p1 的值都不能被改变

    static 与 const 的区别:

        const 作用:做安全处理
        const
        1.C 语言提供的一个关键字,被他修饰的变量具有不可变性
        2.便于进行类型检测,使编译对处理内容更多的了解,消除了一些隐患
        3.可以避免模糊的数字出现。同时可以方便的进行参数的调整和修改
        4.可以保护被修饰的东西,防止意外修改,增强程序的健壮性
        5.可以节省空间,避免不必要的内存分配
        6.提高效率------编译器通常不为const 常量分配存储空间,而是将他们保存在符号表中,这使得他们成为编译期间的一个常量,没有了存储与读内存的操作,使得效率更高

    void *   是泛型  可以代表所有的指针类型。如 int * 、 char * 、……

    内存分配参考

  • 相关阅读:
    [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.2.10
    [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.2.9
    [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.2.8
    [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.2.7
    [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.2.6
    [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.2.5
    [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.2.4
    [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.2.3
    [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.2.2
    [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.2.1
  • 原文地址:https://www.cnblogs.com/benpaobadaniu/p/4707033.html
Copyright © 2020-2023  润新知