1.标准链接库提供四个函数实现动态内存管理:
(1)分配新的内存区域:
void * malloc(size_t size); void *calloc(size_t count , size_t size);
(2)调整以前分配的内存区域:
void *realloc(void *ptr , size_t size);
(3)释放以前分配的内存区域:
void free(void *ptr);
2.void * malloc(size_t size);
该函数分配连续的内存空间,空间大小不小于size 个字节。
但分配的空间中的内容是未知的。
该函数空间分配失败则返回NULL。
3.void *calloc(size_t count , size_t size);
该函数也可以分配连续的内存空间,分配不少于count*size个字节的内存空间。
即可以为一个数组分配空间,该数组有count个元素,每个元素占size个字节。
而且该函数会将分配来的内存空间中的内容全部初始化为0 。
该函数空间分配失败则返回NULL。
4. 以上两个分配内存空间的函数都返回void * (空类型指针或无类型指针)返回的指针值是“分配的内存区域中”第一个字节的地址。
当存取分配的内存位置时,你所使用的指针类型决定如何翻译该位置的数据。
以上两种分配内存空间的方法相比较,calloc()函数的效果更好。
原因是它将分配得来的内存空间按位全部置0 。
5. 若使用上述两种分配内存的函数分配一个空间大小为0 的内存,函数会返回一个空指针或返回一个没有定义的不寻常指针。
因此绝不可以使用“指向0 字节区域”的指针。
6. void *realloc(void *ptr , size_t size);
该函数释放ptr所指向的内存区域,并分配一个大小为size字节的内存区域,并返回该区域的地址。
新的内存区域可以和旧的内存区域一样,开始于相同的地址。
且此函数也会保留原始内存内容。
如果新的内存区域没有从原始区域的地址开始,那么此函数会将原始的内容复制到新的内存区域。
如果新的内存区域比较大,那么多出来部分的值是没有意义的。
7. 可以把空指针传给realloc()函数,这样的话此函数类似于malloc()函数,并得到一块内存空间。
如果内存空间不足以满足内存区域分配的请求,那么realloc()函数返回一个空指针,这种情况下,不会释放原始的内存区域,也不会改变它的内容。
8. void free(void *ptr);
该函数释放动态分配的内存区域,开始地址是ptr,ptr的值可以是空指针。
若在调用此函数时传入空指针,则此函数不起任何作用。
9. 传入free() 和realloc()函数的指针(若不为空指针时)必须是“尚未被释放的动态分配内存区域的起始地址”。
否则函数的行为未定义。
Realloc()函数也可以释放内存空间,例如:Char *Ptr = (char *)malloc(20);
如只需要10个字节的内存空间,且保留前十个字节的内容,则可以使用realloc()函数。
Ptr = Realloc(ptr,10); // 后十个字节的内存空间便被释放。