【转】c语言内存分配和释放函数malloc,calloc,realloc,free
时间:2011-03-10 来源:jnje
内存分配和释放函数malloc,calloc,realloc,free
malloc()函数:分配内存空间 (m-memory) void *malloc(size_t size) 其中的size即为所用分配的内存空间的大小。malloc函数有一个将可用的内存块连接为一个长长地列表即空闲链表。调用malloc函数的时候,它将沿着连接表寻找一个足以满足用户要求的内存块。
calloc:分配内存空间并刷新 void *calloc(size_t nitems, size_t size); Allocates the requested memory and returns a pointer to it. The requested size is nitems each size bytes long (total memory requested is nitems*size). The space is initialized to all zero bits. On success a pointer to the requested space is returned. On failure a null pointer is returned. 分配所要求的内存空间并返回一个指向它的指针。要求的内存大小:nitems个大小为size的对象。所分配的内存被初始化为0。 如果分配成功则返回指向所分配内存的指针;否则返回NULL。 calloc与malloc:calloc初始化已分配的内存为0(calloc会把所分配的内存空间的每一位都初始化为0:如果为指针类型的元素分配内存,那么这些元素通常会被初始化为空指针;如果为实型数据分配内存,则这些元素被初始化为浮点型的零),而malloc不初始化分配的内存。calloc返回的是一个数组,而malloc返回的是一个对象。calloc的效率一般是比较低的。 calloc相当于malloc后再加memset,
realloc:重新分配内存(re-重新) void *realloc(void *ptr, size_t size); 更改以前分配区的长度(增加或减少)。当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定。size是存储区的newsize新长度,而不是新旧长度之差。例子: 如果先分配一个可容纳长度为512的数组的空间,并在运行时填充它,但又发现空间不够,则可调用realloc扩充该存储空间。如果该存储区后有足够的空间可供扩充,则可在原存储区位置上向高地址方向扩充,并返回传送给它的同样的指针值。如果原存储区后没有足够的空间,则realloc分配另一个足够大的存储区,将现存的512个元素数组的内容复制到新分配的存储区。因为这种存储区可能会移到位置,所以不应该使用任何指针指向该区中。
free: 释放内存空间以供其他代码使用 void free( void *p);
关于函数使用需要注意的一些地方: 还有一个函数是alloca函数,其调用序列与malloc相同,但是它是在栈帧上分配存储空间。其优点是:当函数返回时,自动释放他所使用的栈帧,所以不必为释放空间而费心。其缺点是:其缺点是:某些系统在函数已被调用后不能增加栈帧长度,于是也就不能支持alloca 函数。尽管如此,很多软件包还是使用alloca函数,也有很多系统支持它。本文出自 51CTO.COM技术博客 |