malloc realloc calloc以及free

malloc

当我们创建变量时,空间也许会太少也许会太多,造成空间的浪费,这时候我们就可以使用malloc来动态的在堆上开辟空间了,如图所示。

此时我们就在堆上开辟了10个整型大小的空间,把首元素的地址存放在ps里。我们再来看看malloc的参数。

首先void*表示他的类型可以根据使用者的需求来自定义,需要什么类型就强转它什么类型,size_t size则表示它的长度必须是无符号整型,毕竟不能开辟负数的空间,而开辟的空间大小也由我们自己决定。再把开辟好的空间存入指针,但是假如我们开辟的空间太大,比如我开辟一百亿一万亿,那肯定是开不出来的,此时ps将会指向null,所以为了稳妥起见,我们在使用开辟的空间前,需要if判断一下是不是 ==null ,如果是,那代表我们没有开辟成功,不能使用它,反之则代表我们可以使用它,就可以利用ps往我们开辟的空间内存东西了,如图所示。

需要注意的点是,由于我们开辟的空间的开头是由ps保存的,所以我们绝对不能改变ps的指向,绝对不能有类似于ps++的情况出现,否则我们将找不到开辟空间的起始位置,造成内存泄漏的问题,而我们malloc出来的空间有点像数组,所以它也会产生越界的问题,这个在我们使用前需要注意。

而当我们使用完了之后,需要手动释放掉这片空间,不然它会一直占用这块内存,而释放则需要使用free来。如图所示。

free会把开辟空间置为空,但是我ps还指向那块空间,可是此时我已经没有访问它的权限了,所以如果不再把ps置为null的话就会产生非法访问的问题。

calloc

可以看到calloc和malloc的参数就多了一个num,而num则是你要给多少个元素分配内存,如图所示。

我给十个元素分配了大小为int的空间,而calloc函数还会很贴心的给你把开辟空间的值给赋为0,这是malloc不会的,

realloc

不多bb,先上图

返回类型和上面一样都是void* 看来也需要我们自定义类型,第一个参数ptr,需要我们给个指向目标,第二个参数开辟的空间接在它后面,形成扩容,但是也有第二种情况,那就是ptr后面的空间放不下我们要扩容的空间了,那realloc会先复制好ptr的内容,然后再找一块新的能放下它们的空间开辟。ptr可以为空,这样realloc会直接新开一个空间出来,就像malloc一样。

当我们realloc开辟好之后也需要判定,前面提到过不能改变指向,所以我们只能新建个pss代替ps了,如果realloc不为空,代表开辟成功,那我们把pss赋给ps就好了,如果为空,那代表没开辟成功,那我们释放掉pss开的空间就好。

成功之后我们就可以继续往里面赋值了 如图所示

柔性数组

这个概念是在c99出来之后才有的,具体就是结构体的最后一个成员可以是一个不定义大小的数组,而这个数组前面必须有一个成员,而计算结构体大小的时候不计算数组的大小,如图所示。

这也解释了为什么数组前必须有一个成员了,因为没有的话大小无法计算了。

而这个数组就是柔性数组,因为它的大小可以根据我们的需求自行开辟,如图所示

这样结构体的大小就是它本身成员的大小+我们需要数组的大小了。并且开辟完之后我们就可以往里面存东西了 如图所示

而当我们觉得空间不够了,还可以进行扩容。

这样我们就实现了扩容+存数据,而在用完之后记得free掉就好。

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值