指针的动态初始化malloc与销毁free-动态内存管理总结

 动态申请内存与静态申请内存的区别:参考该文。 //静态的数组,数组长度是固定的,动态的数组,数组长度是可以任意的,即:可以通过函数传参的形式确定数组长度。

malloc与calloc的区别参考该文

用到四个函数:--alloc是allocate分配的意思。

#include <stdlib>

malloc 、calloc 、realloc、free.

void *malloc(size_t size);

void *realloc(void *ptr,size_t size);

void *calloc(size_t nmemb,size_t size);

void free(void *ptr);

使用的的时候,可以不必将void*强转成对应的指针类型,如int*,因为void*是个百搭类型(除了赋值给函数指针外,C99中没有定义)

即:int *p = malloc(sizeof(int)*3);//假设sizeof(int)==4,则函数的意思是,申请连续的12个字节的内存单元。赋值给int*,只不过表示的是,我是按照int的大小每次来取数的。

当我们没有强转时,编译时会有警告,这是因为我们没有包含该函数的头文件,

在未包含头文件的情况下,函数返回值默认是int,int与指针类型不同,故会报警告。

原则:谁申请谁释放。

释放的原因是为了防止内存泄露,如果忘记free了,虽然当进程退出后,也会将申请的内存释放掉,但是如果进程长期运行,不断的申请内存而不释放内存,会出问题。

指针动态初始化:

int *p = (int*)malloc(sizeof(int)*3);//初始化为指向3个元素的数组
if(!p) exit -1;//这个地方一定要进行判断,因为若动态初始化不成功,在使用p[0]、p[1]、p[2]时报错。

指针的销毁:

free(p);
p = NULL;//避免p为野指针,需要赋值为NULL
         //p中的值仍为原先的内存地址,此时要进行赋值NULL。
         //释放内存后,赋值为NULL的好处还有:当p为NULL时,即便再free n次也不会出错!!!

注意:free的含义:free之后,是想将由malloc分配的内存交还给系统支配,而非代码支配,即由malloc分配的内存中内容由系统进行处理。

其中存在两个值:

一个是指针的值,指针的值并未发生改变,还是原先指向malloc分配的地址。

另一个是malloc分配的内存中的数据值,这其中的值取决于系统有没有使用该内存,如果使用了,该内存中的值会发生改变,如果没有使用,则还是保持原先的值。

 //initList函数中形参的形式是取引用,是因为实参未初始化,未初始化的实参传递时,形参必须时对应的指针或引用

//destroyList函数中形参的形式仍然为取引用,是因为我们想将实参置为NULL,因为倘若仅传递指针的话,指针释放掉形参(实参)所对应的内存空间,并不能将实参置为空,而只是将函数中的形参置为空了,实参仍为野指针。

总结:

初始化要判断内存是否申请成功;

销毁时要赋值NULL 。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值