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的内存块,返回一个指向该内存块的指针。
原型 : 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的内存块,返回一个指向该内存块的指针。
相关文章推荐
- ruby学习之-------问题整理
- 深入理解指针,数组的基本概念
- HDU-5720 Wool
- 算法导论学习笔记(三)红黑树
- HDU 1575 矩阵快速幂裸题
- c++ 标准库的各种容器
- switch(c)语句中,c不可以是什么类型()
- HDU 1575 矩阵快速幂裸题
- IOS compare 字符串比较
- hdu 1316(大整数)
- this关键字与super关键字
- phpstorm sftp无法连接服务器
- 2016微软探星夏令营:#1341 : Constraint Checker
- HDU 1010 Tempter of the Bone
- jQuery.attr() 函数详解
- Tomcat学习1_Tomcat 系统架构与设计模式,第 1 部分: 工作原理
- 刷题有感,java的大整数包运算
- 在32位小端的机器上,如下代码输出是什么:
- mysql索引总结----mysql 索引类型以及创建
- 总结半年的游戏开发经验