动态内存管理的干货

1.malloc函数

void*malloc(size_t  size);(stdlib.h)

功能:在堆区上申请一块大小为size字节的连续空间,返回指向这块空间的地址.

需要注意的是,malloc函数有可能申请失败,此时返回NULL,所以申请之后一定要先检验再使用.

好处:类似于c99中的变长数组,你可以让size为变量,在运行过程中开创想要大小的空间,但是变长数组一但开创就不可改变,而动态空间可以通过realloc改变.

注意:1.如果size为0,可能造成未定义行为.

2.C语言本身不设计程序结束后动态内存的释放,尽管一些操作系统会防止内存泄漏,但为了保险,使用该空间后还是最好要释放,用free函数

2.free函数

void free(void*ptr);(stdlib.h)

功能:释放动态内存空间.ptr必须指向动态空间首地址.

注意:1.如果ptr为NULL,则什么都不做.

2.如果ptr指向了非动态空间,则结果未定义.

3.如果指向动态空间的一部分则程序崩溃.

4.如果多次释放则程序崩溃.

5.没有释放可能导致内存泄漏,如图:

出了test,没人记得这个动态空间的位置,无法再释放它,造成了"吃内存"现象.

2.free函数是值传参,释放空间后,实参的指向仍为原动态空间,这就相当于实参成了野指针,为了避免这种情况,在free语句后要让实参指向NULL

3.calloc

void*calloc(size_t num,size_t size);(stdlib.h)

与malloc只有两处区别:

1.开创num个大小为size字节的连续动态空间

2.开创后会把元素初始化为0(本文只有该函数有此特性),而malloc为随机值;

4.realloc

void* realloc(void*ptr,size_t  size);(stdlib.h)

功能:把ptr指向的开辟好的动态内存空间变为size大小.返回值比较复杂,有三种情况:

1.如果扩大或缩小空间失败会返回NULL.

2.如果扩大空间后与别人的空间重合,那么它会寻找一个新的能容下扩大后的空间的位置,并把旧位置的数据拷贝过去,此时返回的是新空间的地址.

3.如果扩大空间后不与别人的空间重合,返回ptr.

注意:realloc(NULL,size)等价于malloc(size);

5.柔性数组(c99)

如何称为柔性数组

1.数组在结构体中

2.数组是结构体的最后一个成员,且前面必须有其他成员

3.数组大小未知

注意:

柔性数组的大小不计算在结构体大小之内.

使用举例:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值