动态内存分配函数解析


内存区域主要分为栈区,堆区以及静态区。其中,栈区用于存储局部变量,堆区用于存储由动态内存开辟的变量,而静态区则用于存储静态变量以及全局变量。以下是关于四个动态内存分配函数——malloc,calloc,realloc,以及free的讲解。

首先我们来谈谈为何需要动态内存分配。例如,我们在定义一个数组时,必须首先定义其数组长度,如int a[10]等,但往往在很多情况下,我们真正需要的数组长度在程序运行时才能确定,那么先前定义的长度与空间就可能存在过大和过小的问题,因此,我们需要使用动态内存分配。

—.malloc和free函数讲解

在引用这四个函数时,我们首先需要标明所需要的头文件,#include<stdlib.h>。malloc函数使用格式如下:

void* malloc (size_t size);括号内为所需要开辟空间的字节大小。

这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
如果开辟成功,则返回一个指向开辟好空间的指针。
如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己
来决定,并且需要记住在之前使用强制类型转换。
如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。

在使用malloc函数开辟空间之后,我们还需要在使用结束时利用free函数来对开辟的空间进行释放。注意此处的内存销毁,并非字面意思的内存删除,而是相当于把这一块空间再次还给操作系统。free函数使用格式如下:

void free (void* ptr);括号内为所需要释放回收空间的指针变量名。

同时我们需要注意两点:

第一,如果我们释放的指针不是由动态分配的,则free函数的行为是未定义的

第二,如果释放的指针是NULL指针,那么free函数将不进行任何操作。

定义并初始化未知长度数组的两种方式

二.calloc函数讲解

我们首先来看calloc函数的运用格式:

void* calloc (size_t num, size_t size);

其功能为把num个大小为size的元素开辟一块空间,与malloc函数的区别在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。

例子如下:

三.核心——realloc函数

在函数使用过程中,我们常常会遇到诸如先前开辟的内存不太能满足后续使用的问题,那么如何在使用过程中改变先前所设置的空间大小,令内存可以动态分配呢,realloc函数就是核心。

realloc使用格式如下:

void* realloc (void* ptr, size_t size);
ptr 是要调整的内存地址
size 调整之后新的空间字节大小
返回值为调整之后的内存起始位置。
这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到 新 的空间。


realloc在调整内存空间时存在两种情况:
情况1:原有空间之后有足够大的空间用于调整

情况2:原有空间之后空间不足


当是情况1 的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。

当是情况2 的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小
的连续空间来使用。这样函数返回的是一个新的内存地址。

四.常见使用错误

1.对null指针的解引用操作

2.对动态开辟空间的越界访问

3.对非动态开辟变量使用free释放

4.free函数仅释放了部分内存

5.对同一块内存多次释放

6.动态开辟内存忘记释放


 


 


  • 39
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值