【转】c语言内存分配和释放函数malloc,calloc,realloc,free

时间:2024-03-10 13:52:29

内存分配和释放函数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);

 

 

关于函数使用需要注意的一些地方:
A、申请了内存空间后,必须检查是否分配成功。

B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。

C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。

D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一 些编译器的检查。


还有一个函数是alloca函数,其调用序列与malloc相同,但是它是在栈帧上分配存储空间。其优点是:当函数返回时,自动释放他所使用的栈帧,所以不必为释放空间而费心。其缺点是:其缺点是:某些系统在函数已被调用后不能增加栈帧长度,于是也就不能支持alloca 函数。尽管如此,很多软件包还是使用alloca函数,也有很多系统支持它。本文出自 51CTO.COM技术博客