• c语言中的内存管理


    一:内存分为5大区域

         栈区     --  存放局部变量

         堆区     --  程序运行过程中,动态分配的内存

         BSS区    --  未初始化的全局变量和静态变量 

         数据段    --  已经初始化的全局变量和静态变量

         代码段    --  程序编译产生的二进制的数据

    内存分配方式:

        ·1)静态分配,在编译的阶段分配的内存     int a = 10;    静态分配的内存在程序结束后会自动释放

         2)动态分配,在程序的运行过程中进行的内存分配 ,动态分配的内存一般存储在堆中,程序结束后内存不会自动释放,需要手工释放

       C语言库提供了三个函数进行动态分配内存:

            1>malloc

        1)malloc(长度) 向内存申请指定的长度的连续空

                    如果成功:返回的时新申请的内存空间的首地址

                    失败:返回NULL

          malloc函数的返回值为void *类型所以分配非空类型需要强转。比如(int *)malloc(sizeof(int)*元素个数);

      代码:

    void m_alloc(){
    
    
        //动态申请20个字节的内存空间,内存空间的首地址放到p中
        int *p = (int *)malloc(5*sizeof(int));
        //判断是否分配成功
        if(p!=NULL){
            
            memset((void *)p,0,sizeof(p));
            for (int i=0; i<5; i++) {
                printf("%d	",*p++);
            }
            printf("
    ");
            //如果成功,可以存放数据了
            *p = 1;
            *(p+1) = 10;
            *(p+2) = 100;
            *(p+3) = 1000;
            *(p+4) = 10000;
            
            for (int i=0; i<5; i++) {
                printf("%d	",*p++);
            }
            
        }else{
            printf("内存分配失败!");
        }
    
    
    }

    注意:

             1)malloc()  申请的空间,如果不初始化,存放的也是垃圾数

             2)进行初始化  memset(地址,用什么初始化,长度);    

    2> calloc  

    calloc(4,4)  第一个4,申请几块    第二个4 每一块的长度4               calloc(10,sizeof(int));

    void c_alloc(){
    
    
        //        (void *)      分5块    每块的大小
        char *p = (char *)calloc(5, sizeof(char));
        char *p1=p;
        //  判断是否成功
        if (p!=NULL) {
            
            //        for (int i=0; i<5; i++) {
            //            printf("%d	",*p++);
            //        }
            
            printf("
    ");
            
            for (int i=0; i<5; i++,p++) {
                *p=65+i;
                
            }
            
            //        *p = 'A';
            //        *(p+1)=65;
            //        *(p+2)='a';
            //        *(p+3)='z';
            //        *(p+4)='x';
            
            for (int i=0; i<5; i++) {
                printf("%c	",*p1++);
            }
            
        }
    
    }

    经常用来申请数组的空间

    注意:   calloc 可以帮我们自动初始化为0

     3>realloc 

    realloc(地址,新的长度)      重新修改大小后,让原指针重新指向一次    p = (int *)realloc(p,100);

    void re_alloc(){
    
     
    
     
    
     
    
        //        (void *)      分5块    每块的大小
    
        char *p = (char *)calloc(5, sizeof(char));
    
        char *p1=p;
    
        //  判断是否成功
    
        if (p!=NULL) {
    
            
    
            for (int i=0; i<5; i++,p++) {
    
                *p=65+i;
    
                
    
            }
    
            // A B  C D E
    
            //重新修改大小以后,重新指向一次
    
            p1 = realloc(p1, 7*sizeof(char));
    
            *(p1+5)='a';
    
            *(p1+6)='b';
    
            
    
            for (int i=0; i<7; i++) {
    
                printf("%c	",*p1++);
    
            }
    
            
    
        }

    4)free();

          为什么要使用free()

           如果不使用free释放掉我们自己申请的内存空间,有可能会造成内存泄露

          free 释放存储空间    

          int *p = (int *)malloc(12);

          free(p);  //释放

          *p = 10; (错误的)因为p所指向的内存空间已经被释放所以*p所指向的内存空间不能赋值操作,一般我们要讲指针为空   p = NULL;

  • 相关阅读:
    报错:java.lang.IllegalStateException
    Eclipse中修改SVN用户名和密码方法
    部署服务器项目报错
    mybatis的双数据源创建
    SVN改地址eclipse怎么同步
    java中文乱码问题解决
    python3 内置函数
    python 生成器generator
    python 理解高阶函数
    python3 装饰器
  • 原文地址:https://www.cnblogs.com/-boy/p/4051002.html
Copyright © 2020-2023  润新知