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

xiaoxiao2021-02-28  40

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

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

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

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

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

(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 一模一样。

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

     

转载请注明原文地址: https://www.6miu.com/read-2620969.html

最新回复(0)