C和指针——动态内存分配

malloc和free:C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放。这些函数维护一个可用内存池。当一个程序另外需要一些内存时,调用malloc函数,malloc从内存池中提取一块合适的内存,并向该程序返回一个指向这块内存的指针。当一块以前分配的内存不再使用时,程序调用free函数把它归还给内存池。两个函数都在头文件stdlib.h中声明,函数原型如下:

one

malloc的参数就是需要分配的内存字节数。如果内存池中可用内存可以满足这个需求,malloc就返回一个指向被分配的内存块起始位置的指针。malloc所分配的是一块连续的内存。如果内存池是空的,或者它的内存无法满足请求,在这种情况下,malloc函数向操作系统请求,要求得到更多的内存,并在这块新内存上执行分配任务。如果OS无法向malloc提供更多的内存,malloc就返回一个NULL指针。

free的参数必须要么是NULL,要么是一个先前从malloc,calloc或realloc返回的值,向free传递一个NULL参数不会产生任何效果。malloc返回一个类型为void*的指针,正式缘于这个原因,标准表示一个void*类型的指针可以转换为其他任何类型的指针。

calloc和realloc:函数原型如下

two

calloc也用于分配内存。它和malloc之间的主要区别是calloc函数在返回指向内存的指针之前把它初始化为0。两个函数之间另一个较小的区别是它们请求内存数量的方式不同,calloc的参数包括所需要元素的数量和每个元素的字节数。

realloc函数用于修改一个原先已经分配的内存块的大小。使用该函数,可以使一个块内存扩大或缩小。如果用于扩大,那么这块内存原先的内容依然保留,新增加的内存添加到原先内存块后面,新的内存并未以任何方式进行初始化。如果用于缩小,内存块尾部的部分内存便被拿掉,剩余部分内存的原先内容依然保留。如果原先的内存块无法改变大小,函数将分配另一块正确大小的内存,并把原先那块内存的内容复制到新的快上。如果realloc函数的第一个参数是NULL,那么它的行为和malloc一摸一样。

NULL定义于stdio.h,它实际上是字面值常量0。

分配内存但在使用完毕后不释放将引起内存泄漏(memory lead)