本文主要是介绍存储空间的分配(UNIX环境高级编程笔记),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
(1)malloc,分配指定字节的存储区。此存储区中的初值不确定。
(2)calloc,为指定数量指定长度的对象分配存储空间。该空间的每一bit都初始化为0。
(3)realloc,增加或减少以前分配区的长度。当长度增加后,可能需要将以前分配区的内容移动到另一个足够大的区域,以便在尾端提供增加的存储区,而新增区域内的初始值则不确定。
#include <stdlib.h> void *malloc(size_t size); void *calloc(size_t nobj, size_t size); void *realloc(void *ptr, size_t newsize); 3个函数的返回值:若成功,返回非空指针;若出错,返回NULL void free(void *ptr); |
---|
这3个alloc函数都返回通用指针void *,所以如果在进程中包含了#include <stdlib.h>,那么我们将这些函数的返回的指针赋予一个不同类型的指针时,就不需要进行显式的进行强制类型转换。
函数free释放ptr指向的储存空间。被释放的空间通常被送入可用存储区池,以后可在调用上述3个alloc函数时再分配。
realloc函数可以增、减以前分配的存储区的长度。最后一个参数是新储存区的新长度,不是新旧存储区之间的差。若ptr是一个空指针,则realloc的功能和malloc相同。
这些分配例程通常通过sbrk系统调用实现。该系统调用扩充或者缩小进程的堆。
大多数实现所分配的存储空间比所要求的要大一点,额外的空间用来记录管理信息——分配块的长度、指向下一分配块的指针等。
在动态分配的缓冲区之前或之后进行写操作,破坏的可能不仅仅是该区的管理记录信息。
其他可能造成的致命性错误是:释放一个已经释放的块;调用free时所用的指针不是alloc函数的返回值等。如果一个进程调用malloc函数,但是却忘记free,则此进程占用的存储空间就会连续增加,这被称为泄露(leakage)。如果不调用free函数释放不再使用的空间,那么进程地址空间的长度就会慢慢增加,甚至不再有地址空间。此时,由于过度的换页开销,会造成性能下降。
与很多可代替malloc和free的函数。某些系统已经提供代替存储空间分配函数的库。
这篇关于存储空间的分配(UNIX环境高级编程笔记)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!