为了满足动态分配内存的需求,C语言中提供了一些专门的库函数。
1.malloc函数
函数原型如下:
void*malloc(unsigned int size);
其作用是在内存的动态存储区中分配一个长度为size个字节的连续的内存空间并返回该内存空间的首地址,如果未能成功分配内存,则返回空指针(NULL)。
例如执行malloc(100),则会分配100个连续的字节。之所以将返回值的类型定义为void*,是因为分配内存时是以字节作为分配单位的,但是在分配了100个字节后,这100个字节中将要存放什么类型的数据是由程序员来确定,可以存放100个字符,也可以以4字节为单位存放25个int型的整型数据。根据存放的数据类型的不同,首地址的类型也不同,如果存放字符型数据,则首地址就是一个指向字符的指针;而如果存放整型的数据,则首地址就是一个指向整型单元的指针。如图7-15所示。
图7-15 动态分配内存示意图
在调用此函数做动态内存分配时,一般都会根据存放数据的类型而对返回的地址做强制类型转换,如果要存放int数据,其调用形式一般为:
(int*)malloc(100);
函数调用前边的(int*)就是要将malloc函数返回的首地址转换为int*类型的指针。而函数原型中将返回类型定义为void*,就是为了便于程序员在调用该函数时做强制类型转换。
2.calloc函数
其函数原型为:
void*calloc(unsigned int n,unsigned int size);(www.xing528.com)
其作用是在内存的动态存储区中分配n个长度为size字节的联系存储空间。函数返回值为所分配的连续存储空间的首地址,分配失败则返回空指针(NULL)。
该函数的基本使用方法同malloc函数使用方法相同,本质上也是一样的,只是调用形式上的差别,因为连续开辟n个长度为size个字节的存储单元所占用的总字节个数就是n*size个字节,等价于malloc(n*size)。
3.realloc函数
其函数原型为:
void*realloc(void*p,unsigned int size);
其作用是在内存的动态存储区中从指定的地址p开始分配一个长度为size个字节的连续的内存空间并返回该空间首地址,若分配失败返回空指针(NULL)。
在使用realloc函数分配内存时允许指定起始地址,该函数一般常和malloc、calloc函数联合使用。使用malloc函数分配空间后,在程序运行过程中若发现内存空间不够使用,则可以指定原空间的首地址为起始地址重新开辟更大的内存,从而在效果上达到追加内存空间的目的。例如利用malloc函数开辟了50个单元,p指针是这50个单元的首地址,在空间不够时,可以用realloc函数,指定p为起始地址,重新开辟60个单元,其效果等价于在原来的50个单元后面又追加了10单元,如图7-16所示。
4.free函数
其函数原型为:
void free(void*p);
该函数的作用是释放由指针p作为首地址的一块连续内存。在动态分配函数执行后,系统从物理内存中分配一块连续的内存空间给程序使用,此期间这块空间将一直被该程序占有而不会管这块内存是否是真的被使用。这就好比到酒店住宿,一旦开好房间后,该房间就会一直由开房者所占有,管理人员不会知道这间房子是一直有人住还是空着的,但是在该房间被退房以前,是不可能再分配给其他的顾客的。系统中也是如此,一旦内存被分配出去后,该内存在被回收之前就不可能再被分配给其他的申请内存的程序。因此为了避免内存的浪费,在一块内存不再被使用时,应该执行free(退房间)操作,将这块内存退回给系统,使得系统能够将此内存重新分配给提出了分配申请的程序。
图7-16 realloc重新分配内存示意图
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。