您的位置:首页 > 其它

malloc,realloc,calloc的使用场合及特点,以及malloc的实现原理

2016-07-18 20:14 260 查看
malloc:

原型 :  extern void *malloc(unsigned int num_bytes);

何时使用:当需要在内存的动态存储区中分配一块长度为num_bytes字节的连续区域时。参数num_bytes为需要的内存空间的长度,返回该区域的地址。

特点:

malloc在动态分配完内存后不对分配的内存空间初始化,里边数据是随机的垃圾数据。

实现原理:

它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿链表寻找一个大到足以满足用户请求所需要的内存
块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。

calloc

原型:void *calloc(size_t n, size_t size);

何时使用:当需要在内存的动态存储区中分配n个长度为size_t
size字节的连续空间时。如果分配成功,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。

特点:

calloc在动态分配完内存后,自动初始化该内存空间为零。

realloc

原型:extern void *realloc(void
*mem_address, unsigned int newsize);

何时使用:当需要在已经被(malloc(),
calloc(), 或realloc())分配的空间的基础上重新分配空间时。参数mem_address为原有的空间地址,newsize是重新申请的地址空间。

特点:

①传递给realloc的指针必须是先前通过malloc(),
calloc(), 或realloc()分配的

②如果realloc需要的内存小于原来的内存大小,会导致数据丢失;如果原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址;
如果原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址

③如果没有足够可用的内存用来完成重新分配(扩大原来的内存块或者分配新的内存块),则返回NULL。而原来的内存块保持不变。

④如果newsize大小为0,那么释放mem_address指向的内存,并返回NULL。

⑤如果mem_address为NULL,则realloc()和malloc()类似。分配一个newsize的内存块,返回一个指向该内存块的指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: