c语言进阶(4)动态内存分配

为什么要使用动态内存分配

当我们在声明一个数组时,必须用一个常量来指定数组的长度,而数组的长度往往在运行时才知道,这是因为它所需要的空间取决于所输入的数据,但是,当我们声明的数组每次需要存放不同的数据时,我们无法预知所需要的空间时多大,通常采用的办法是,每次运行时修改一下数组大小,这种办法不仅麻烦还有以下三个缺点:

  1. 这种声明在程序中引入了人为的限制,如果程序需要使用的元素超过了数组声明的长度,它便会无法处理这种情况,这时便需要将数组的长度设的更大一些;
  2. 而如果此时存放了一个较小数据,又会导致空间巨大浪费;
  3. 当出现输入数据超出最大限制时,应该以一种合理的方式作出相应,而不是由一个异常而失败,但也不该打印出看上去正确但实际上是错误的结果。

malloc
malloc是用于动态内存分配的函数,当一个程序需要一些另外的内存时,malloc从内存池提取一块合适的内存,并向该程序返回一个指向这个内存的指针。
malloc申请的是一块连续的内存,例如,如果它申请100个字节的内存,那么它实际分配的内存就是100个连续的字节,并不会分开位于两块或多块不同的内存。
calloc
calloc也用于内存分配,calloc和malloc的区别主要是,calloc在返回指向内存的指针之前会把它初始化为0。
realloc
realloc用于修改一个已经分配了的内存块的大小。
如果它用于扩大一个内存块,那么这个内存块原来的内容依然保留,新增加的内存添加到原先内存块的后面。
如果它用于缩小一个内存块,那么该内存尾部的内存块将会被拿掉,原先内存块的内容将会被保留;如果原先内存块无法改变大小,realloc将分配另一块正确大小的内存,并把原先那块内存的内容复制到新的内存块上,因此在使用realloc之后便不能使用原来那个指向旧内存的指针,而是应该改用realloc返回的新指针.

free
当申请的内存块不再使用时,要用free函数把内存块归还到内存池中。
free的参数要么是NULL,要么是从先前的malloc,calloc,realloc返回的值,向free返回NULL没有任何效果。

发布了34 篇原创文章 · 获赞 4 · 访问量 1751

猜你喜欢

转载自blog.csdn.net/qq_41181857/article/details/102839046