动态内存分配(malloc,calloc,realloc)

1.为什么会有动态内存分配

        对于静态定义的数组变量,长度大小是固定的,代码灵活小很低

        而动态分配内存,你想要多少空间,就分配多少空间,想扩容多少空间,就扩容多少空间

        无论是对于代码灵活性还是自己的主观臆断性都有了很好改观


动态开辟空间函数

   头文件:#include<stdlib.h>

(1)malloc

  •  void* malloc(size_t num)    (size_t)无符号类型整数

  •  这个函数向内存申请一块连续可用的空间,并返回指向这块内存空间

  • 地址如果开辟成功,则返回开辟好空间的地址,如果开辟失败,则返回NULL,因此malloc的返回值一定要检查,不然很容易报空指针错误

  • 由于函数的返回值是vod*,所以在使用的时候需要自己决定使用什么类型,然后强制转换

  • 如果num为0,malloc的标准行为是没有定义的,取决于编译器


成功开辟:

开辟失败                     

 


可以看出,如果是整型指针动态分配内存的话,其本质可以看作一个整型数组


 整型指针malloc开辟空间后,如果没有初始化里面的值,空间里的值是随机的(0Xcdcdcdcd)


(2)calloc

  • void* calloc(size_t num,size_t size);

  • 开辟一块大小为num,数量为size的空间,并将地址的每个空间的字节初始化为0

与malloc的区别只在于malloc会将开辟好的每个空间的字节初始化为0



(3)realloc 

  • void* realloc(void* ptr,size_t size)   ptr是需要调整的地址,size是调整的大小,单位是字节返回值,是内存的起始位置 
  • realooc可以让我们的空间管理的更加灵活
  • 当我们发现空间调大或者调小了的时候,可以使用realloc函数对空间对其调整   

      realloc追加空间时,有两种情况:

  1. 当内存空间足够大时,返回空间的起始地址
  2. 当内存空间不足时,realloc会找一块更大的空间,并且原来地址上的数据全部复制过来,返回新空间的地址值

 很明显可以看出,调整后的两处空间值不一样


这么写代码是存在很大隐患的,当realloc开辟失败后,会返回空指针,那么p以前的空间地址存储的数据都没了

正确的写法应该是创建一个临时变量先接收调整后的地址值,再判断是否为空,不为空便赋值给原地址


 当指针变量为空时,realloc的作用与malloc的作用一样


(4)free

        任何用动态开辟的空间,在程序使用时一定要使用free()函数进行内存释放,不然          会造成内存泄漏


小结:

        动态开辟内存可以让我们更加灵活地使用内存空间,完成较灵活的代码,但其中也要注重很多细节,比如开辟空间后空指针的判断,或是开辟空间后是否使用free函数进行内存释放。故有更好方法的同时,也一定要注重其实现细节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值