动态内存分配函数的学习笔记

//************************************************************************************************************************

为什么要进行动态内存分配?

不使用动态内存时,当一个数组被声明时,它所需要的内存在编译时就被分配。

但是有时,定义了一个数组 ,而输入的数据较多,超过了数组定义的范围。此时就需要进行动态内存分配。

//*************************************************************************************************************************四个函数:

(1)malloc 和 free:

         maolloc 和 free 是C 提供的库函数。分别用于动态内存分配和释放。

         malloc 函数:当一个程序另外需要一些内存时,它就调用malloc 函数,malloc 从内存池中提取一块合适的内存,并向该程序返回一个指向这块内存的指针。 但是这块提取出来的内存并没有以任何方式进行初始化。如果对这块内存进行初始非常重要,要么自己动手进行初始化,要么使用 calloc 函数。

         free 函数:当一块以前分配的内存不再使用时,程序调用 free 函数把它归还给内存池供以后之需。

         函数原型:

void *malloc(size_t size);
void free(void *pointer);

          a.这两个函数存在于头文件 stdlib.h 中;

          b.size_t是一个无符号类型,定义于stdlib.hb;

          c.malloc 的参数就是需要分配的内存字节(字符)数。如果内存池中的可用内存可以满足这个需求,malloc就返回一个指向被分配的内存块起始位置的指针。

           d.malloc 所分配的是一块连续的内存。

           e.如果内存池是空的,或者它的可用内存无法满足你的请求,那么malloc 函数向操作系统请求,要求得到更多的内存,并在这块新内存上执行分配任务。如果操作系统无法向 malloc提供更多的内存,malloc 就返回一个NULL 指针。因此,对每个从malloc返回的指针都进行检查,确保它并非NULL 是非常重要的。

           f.   free  的参数必须要么是NULL,要么是一个先前从malloc , calloc或 realloc 返回的值。向free 传递一个单纯的NULL参数不会产生任何效果。

(2)calloc 和 realloc

           函数原型如下:

void *calloc(size_t num_elements,
             size_t element_size);
void realloc(void *ptr,size_t new_size);

a. calloc 也用于分配内存。 malloc 和 calloc 之间的主要区别是:

     后者在返回指向内存的指针之前把它初始化为0;

     它们请求内存数量的方式不同:calloc 的参数包括所需元素的数量每个元素的字节数。根据这些值,它能够计算出总共需要分      配的内存。

b.   realloc 函数用于修改一个原先已经分配的内存块的大小。使用这个函数,你可以使一块内存扩大或缩小。

      如果它用于扩大一个内存块,那么这个内存块原先的内容依然保留,新增加的内存添加到原先内存块的后面,新内存并未以任何方法进行初始化。

     如果用于缩小一个内存块,该内存块尾部的部分内存便被拿掉,剩余部分内存的原先内容依然保留。

     如果原先的内存块大小无法改变,realloc 将分配另一块正确大小的内存,并把原先那块内存的内容复制到新的块上。

      因此,在使用realloc 之后,你就不能再使用指向旧内存的指针,而是应该改用realloc所返回的新指针。

      最后,如果 realloc 函数的第一个参数是NULL,那么它的行为就和malloc 一模一样。

//*************************************************************************************************************************


     
























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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值