malloc函数可以从堆上获得指定字节的内存空间,其函数声明如下:
void * malloc ( unsigned int size ) ;
其中,形参 size 为要求分配的字节数。如果函数执行成功,malloc 返回获得内存空间的首地址;如果函数执行失败,那么返回值为 NULL。 当内存不再使用时,要使用 free() 函数释放内存块.。需要注意的是,malloc 函数分配的到的内存空间是未初始化的,要调用 memset 函数将其初始化为全 0 。
memset 函数的声明如下:
void * memset ( void * p , char ch, unsigned n ) ;
其中,p 为要清零的内存空间得首地址,ch 为要设定的值,n 为被操作的内存空间的字节长度。该函数的功能是设置 p 中的所有字节为 ch ,p 数组的大小为 n 。
free函数可以实现释放内存的功能。其函数声明为:
void free ( void * p ) ;
由于形参为 void 指针,free 函数可以接受任意类型的指针实参。但是, free 函数只是释放指针的内容,而该指针仍然指向原来指向的地方。此时,指针为野指针。需要再将指针的值置为 NULL ,即 p = NULL 。
calloc 函数的功能与 malloc 函数的功能相似,都是从堆分配内存。其函数声明如下:
void * calloc ( unsigned n , unsigned size ) ;
函数返回值为 void 型指针。如果执行成功,函数从堆上获得 size*n 的字节空间,并返回该空间的首地址。如果执行失败,函数返回 NULL 。同样,在内存不再使用时要用 free() 函数释放内存块。 该函数得到的内存空间是经过初始化的,其内容全为 0 。calloc 函数适合为数组申请空间,可以将 size 设置为数组元素的空间长度,将n设置为数组的容量。
realloc 函数可以实现内存分配和释放的功能。其函数声明如下:
void * realloc ( void * p ,unsigned int newsize ) ;
其中,指针 p 必须为指向堆内存空间的指针,即由 malloc 函数、 calloc 函数或 realloc 函数分配空间的指针。realloc 函数将指针 p 指向的内存块的大小改变为 newsize 字节。 如果 newsize 小于或等于 p 之前指向的空间大小,那么保持原有状态不变;如果 newsize 大于原来 p 之前指向的空间大小,那么系统将重新为 p 从堆上分配一块大小为 newsize 的内存空间。 realloc 函数分配的空间也是未初始化的。必须使用memset 函数对其内存初始化。