C语言的stdlib库提供了内存分配与管理的函数:
1、通过调用calloc、malloc和realloc所分配的空间,如果连续调用它们,不能保证空间是顺利或连续的。当分配成功后,函数将返回一个指针,这个指针指向分配成功的空间的开始位置, 它可以被指向任意类型的对象,当分配空间失败后,返回NULL指针。
2、通过free函数释放空间。
3、函数说明
(1)calloc函数
函数的原型为:
void *calloc(size_t nmemb,size_t size);
为nmemb个对象的数组分配空间,每个元素的大小为size,分配的空间所有位被初始为0。
(2)free函数
函数的原型为:
原型:extern void free(void *ptr);
释放指针ptr所指向的的内存空间。ptr所指向的内存空间必须是用calloc,malloc,realloc所分配的内存。如果ptr为NULL或指向不存在的内存块则不做任何操作。
释放的空间还可以被重新分配,
(3)malloc函数
void *malloc(size_t size);
分配长度为size字节的内存块。如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。
(4)realloc函数
void *realloc(void *ptr, size_t size);
改变ptr所指内存区域的大小为size长度。如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。新分配空间比空间大,并包括原空间的的内容,但因为分配新空间,没有初始化0的操作,所以新空间中除去旧空间的部分的内容不能保证清空为零。
4、C语言中数据对象空间分配原理
C语言中的数据对象存储在以下3种空间中:
(1) 程序在开始执行前,分配 静态存储空间,并进行初始化,如果没有指定数据对象的初始值,则每个标题 的值 初始化为零。这样的数据对象在程序结束前一直存在。
(2) 程序在每一个程序块的入口分配动态存储空间。如果没有指定数据初始值,它的初始内容不确定,可能上次程序使用释放过的内存内容(释放内存本身并不清空内存中的数据,只是标记这块内存操作系统可重新使用)。 这些数据对象在程序块执行完毕前一直存在。
(3) 调用calloc、malloc、realloc时,程序才分配可被程序员人为操纵的存储空间,仅当调用calloc时,空间才被初始化。这样分配的数据对象要用free函数释放。否则将生存到程序结束。
5、堆的原理
静态存储空间存在在于程序的整个执行过程 中,动态 存储空间是后进先出,可用栈实现。
动态存储空间经常与函数调用与返回数据一起使用堆栈。可被人为操纵的存储空间不遵守这个规定。C语言的标准库维持着叫“堆”的空间池来控制被calloc、malloc、realloc函数分配的存储空间。