动态内存

一.内存分配方式

1.在静态存储区域中进行分配:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。

                                                  例如全局变量,static变量

2.在栈中进行分配:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时,这些存储但愿自动被释放。效率很高,但是分配的内存容量比较有限

3.在堆中进行分配:在堆上分配也称为动态内存分配:程序在运行的时候用malloc等函数申请任意多少的内存,程序员自己负责在何时用free释放内存。动态内存分配的生存期由我们自己决定,使用非常灵活,但是问题相对也比较多;注意://如果没有释放的话,很容易就会造成内存溢出,因为堆中的内存块是全局的,因此不会因为函数的调用而结束

二.malloc

动态创建一个数量为n的数组
   int *arr=(int *)malloc(n*sizeof(int));
   assert(arr!=NULL)
   if(arr==NULL)
     { return ;}
   free (arr);

三.calloc

动态扩大缩小申请的内存

动态创建一个数量为10的数组,并将其置为0
      int *p=(int *)malloc(10*sizeof(int));          //完全等价于 int *p=(int *)calloc(10,sizeof(int));
       assert(p!=NULL);
       for(int i=0;i<10;i++)
       {
         p[i]=0;
       }
      free(p);
四.realloc

动态扩大缩小申请的内存
1:当扩展内存的时候,不会对添加进内存块的字节进行初始化
2:若不能调整内存则返回NULL,但原有内存中的数据是不会发生改变的
3:若第一个参数为NULL那么功能 等同与malloc函数,若第二个参数为0,那么会释放调用内存块

   p=(int *)realloc(p,20*sizeof(int));  //扩容
   free(p);

   p=(int *)realloc(p,5*sizeof(int));   //缩小
   free(p);

五.free
   free之后如果还有这块内存地址的话,此时这块内存归还给了系统,(可能这块内存还处于一个空闲状态)但是还是可以对其进行操作。里面的值短暂的会保留。
   free之后,申请内存的那个指针就会变成野指针(声明了,但是没有任何指向的指针),有时候会出现野指针错误; 
   所以尽量在操作之后:将指针置为NULL 
   注意:申请和释放是成对的,所以程序是不能进行多次free的,否则会崩溃的
 

六.动态内存崩溃原因

 1.使用未分配成功的内存,可以用assert断言指针是否为NULL
 2. 引用分配成功但尚未初始化的内存 ,可以将其赋初值
 3.虽然初始化但是要注意程序越界,可能尾信息被修改
 4.一旦忘记忘记释放内存,会造成内存泄露,申请内存和释放内存需要成双
 5.释放内存之后却继续去使用这一块内存 ,free之后,把指针置为NULL
 6.指针消亡了,并不表示它所指向的内存会被自动释放,(在free之前,直接将指针设为NULL) 
    内存释放了,并不代表指针会消亡或者成了NULL指针(在free之后,指针并没有进行NULL设置)

 7.野指针问题,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要让他有所指向,free指针之后,如果没将其置为NULL,也会出现“野指针”。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值