malloc函数可以从堆上获得指定字节的内存空间,其函数声明如下:
void * malloc(int n);
参数释义:
n:申请空间大小(数据类型大小 * 个数)
函数详述:
其中,形参n为要求分配的字节数。
如果函数执行成功,malloc返回获得内存空间的首地址;
如果函数执行失败,那么返回值为NULL。
由于malloc函数返回值的类型为void类型指针,可以将其返回值类型转换后赋给任意类型指针。
这样就可以通过操作该类型指针来操作从堆上获得的内存空间。
需要注意的是:
malloc函数分配得到的内存空间是未初始化的。
通过malloc函数得到的堆内存必须使用memset函数或者bzero函数来初始化。
calloc函数的功能与malloc函数的功能相似,都是从堆分配内存。
其函数声明如下:
void *calloc(int n, int size);
参数释义:
n:申请的个数
size:数据类型大小
注意:最后申请空间大小为: n * size。
函数详述:
函数返回值为void类型指针。
如果执行成功,函数从堆上获得n * size字节空间,并返回该空间的首地址。
如果执行失败,函数返回NULL。
该函数与malloc函数的一个显著不同时是:
calloc函数得到的内存空间是经过初始化的,其内容全为0。
calloc函数适合为数组申请空间,
将n设置为数组的容量,将size设置为数组元素的长度。
realloc函数的功能比malloc函数和calloc函数的功能更为丰富,可以实现内存分配和内存释放的功能,
其函数声明如下:
void * realloc(void * p, int n);
参数释义:
p:堆上已经存在的内存空间地址。
n : 申请空间大小。
函数详述:
其中,指针p必须为指向堆内存空间的指针,即由malloc函数、calloc函数或realloc函数分配空间的指针。
realloc函数将指针p指向的内存块的大小调整为n字节。
如果n小于或等于p之前指向的空间大小,保持原有状态不变。
如果n大于原来p之前指向的空间大小,系统将重新为p从堆上分配一块大小为n的内存空间,
同时将原来指向空间的内容依次复制到新的内存空间上,p之前指向的空间被释放。
注意:
(1)realloc函数分配的空间是未初始化的。
通过malloc函数得到的堆内存必须使用memset函数或者bzero函数来初始化。
(2)使用malloc函数,calloc函数 或者 realloc函数分配的内存空间都要使用free函数或指针参数为NULL的realloc函数来释放。
1、malloc()
头文件:stdlib.h
声明:void * malloc(int n);
含义:在堆上,分配n个字节,并返回void指针类型。
返回值:分配内存成功,返回分配的堆上存储空间的首地址;否则,返回NULL
初始化:未初始化
2、calloc()
头文件:stdlib.h
声明:void *calloc(int n, int size);
含义:在堆上,分配nsize个字节,并初始化为0,返回void 类型
返回值:同malloc() 函数
初始化:已初始化
3、recalloc()
头文件:stdlib.h
声明:void * realloc(void * p,int n);
含义:重新分配堆上的void指针p所指的空间为n个字节,同时会复制原有内容到新分配的堆上存储空间。
注意,若原来的void指针p在堆上的空间不大于n个字节,则保持不变。
返回值:同malloc() 函数
初始化:未初始化
1、memset()
头文件:string.h
声明:void * memset (void * p, int c, int n) ;
含义:对于void指针p为首地址的n个字节,将其中的每个字节设置为c。
返回值:返回指向存储区域 p 的void类型指针。
2、bzero()
头文件:string.h
声明:extern void bzero(void *s, int n)
含义:置字符串s的前n个字节为零且包括‘\0’。
返回值:无。
3、free()
头文件:stdlib.h
声明:void free (void * p);
含义:释放void指针p所指的堆上的空间。
返回值:无。