动态内存分配

博客搬家:https://blog.csdn.net/zheyufuck/article/details/53100759

在C中动态内存分配函数有:malloc、realloc、calloc、free。他们各自是如何实现的呢。

1、 malloc函数
malloc 函数是从堆上分配一块内存,所分配的内存大小由该函数唯一的参数指定,返回值为void 指针,如果分配内存失败,就会返回NULL。此函数在分配内存时不会清空或修改内存,所以新分配的内存中包含有垃圾数据。其函数原型为: void * malloc(size_t );
其用法为:int * p = (int *)malloc(sizeof(int));

这里写图片描述

2、calloc函数
calloc函数的原型为:void *calloc(size_t numElements,size_t elementSize);
calloc 函数会根据numElements和elementSize两个参数乘积来分配内存,并返回一个指向内存的第一个字节的指针;如果分配失败,则返回NULL。与malloc函数不同是calloc函数会在分配内存的同时清空内存。其用法为:int * p = calloc(3,sizeof(int)); 这里就分配了3*4=12个字节。

3、realloc函数
realloc函数原型为:void *realloc(void *ptr,size_t size);
realloc 函数用来修改已分配内存块大小,即在之前分配的内存块的基础上,将内存重新分配为更大或更小的部分。函数中有两个参数,第一个参数是指向原来内存块的指针,第二个参数是请求的大小。
请求的大小会出现两种情况:①比当前分配的字节数小;②比当前分配的字节数大。下面举个简单的例子来说明:
这里写图片描述

①如果比当前分配的小,那么多余的内存会还给堆,不能保证多余的内存会被清空(为红色部分所示)
这里写图片描述

②如果比当前分配的大,那么可能会在紧挨着当前分配内存块的区域分配新的内存,否则就会在堆的其他位置分配并把就的内存复制到新区域
这里写图片描述

4、free 函数
free函数是用来释放内存还给堆管理器的。其函数原型为:void free(void *ptr);
指针参数是指向malloc类函数分配的内存地址,这块内存会返还给堆。尽管指针仍然指向这块区域,但是我们应该将其看成是指向垃圾数据,可重新分配这块数据,并重新装进不同的数据。如下图所示
这里写图片描述

既然说到free函数,就不得不提一下内存泄漏问题。内存泄漏的一个问题是无法回收内存并重用,堆管理器可用的内存将变少。所以如果不再使用已分配的内存却没有将其释放就会发生内存泄漏,导致内存泄漏的情况可能如下:
①丢失内存地址
这里写图片描述

②应该调用free函数却没有调用(有时候也称为隐式泄漏)
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值