【武汉华嵌嵌入式培训】内存分配函数用法小结.docx

【武汉华嵌嵌入式培训】内存分配函数用法小结.docx

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
内存分配函数用法小结 作者:武汉华嵌嵌入式培训中心 技术部 一、用户空间内存分配: malloc、calloc、realloc 1、malloc原型如下: extern void *malloc(unsigned int num_bytes); 功能: 分配长度为num_bytes字节块。 工作机制: malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的 所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请 求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小 相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给 用户,并将剩下的那块(如果有的话)返回到连接表上。 2、calloc原型如下: void *calloc( un sig ned n,un sig ned size); 功能: 在内存的动态存储区中分配n个长度为size的连续空间 3、realloc原型如下: exter n void *realloc(void *mem_address, un sig ned int n ewsize); 功能: 先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存 区域,而后释放原来mem_address所指内存区域,同时返回新分配的内存区域的 首地址。即重新分配存储器块的地址。 注意:malloc和calloc的区别: calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化, 里边数据是随机的垃圾数据。 realloc 注意事项: a、 realloc 失败的时候,返回 NULL b、 realloc失败的时候,原来的内存不改变,不会释放也不会移动。 c、 假如原来的内存后面还有足够多剩余内存的话, realloc的内存等于原 来的内存加上剩余内存,realloc 还是返回原来内存的地址;假如原来的内存后 面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据 拷贝到新内存里,原来的内存将被free掉,realloc 返回新内存的地址。 d、 如果size为0,效果等同于free()。 e、 传递给realloc 的指针必须是先前通过malloc(), calloc(), 或 realloc()分配的。 f、传递给realloc 的指针可以为空,等同于 malloc 。 以上三者的事例代码如下: #i nclude <stdio.h> #i nclude <malloc.h> #include <string.h> int main() { //最好每次内存申请都检查申请是否成功 //下面这段仅仅作为演示的代码没有检查 char *pt1; char *pt2; char *pt3; pt1 = (char *)malloc(sizeof(char)*10); prin tf("pt1 = %p\n", pt1); //以下可能会输出乱码,说明malloc分配的空间没有被初始化为0 prin tf("%s\n", pt1); scan f("%s", pt1); pt2 = (char *)calloc(10 ,sizeof(char)); prin tf("pt2 = %p\n", pt2); //以下输出为空,说明calloc分配的空间被初始化为0 prin tf("%s\n", pt2); pt3 = (char *)realloc(pt1, sizeof(char)*20); prin tf("pt3 = %p\n", pt3); //以下输出pt1中原先的内容。 prin tf("%s\n", pt3); //以下是释放申请的内存空间 free(pt2); free(pt3); return 0; 、内核空间内存分配:kmalloc、vmalloc 对于提供了 MM(存储管理器,辅助操作系统进行内存管理,提 供虚实地址转换等硬件支持)的处理器而言,Linux提供了复杂的存储管理系统, 使得进程所能访问的内存达到 4GB 进程的4GB内存空间被人为的分为两个部分--用户空间与内核空间。用户空间地 址分布从 0 到 3GB(PAGE_OFFSE在 0x86 中它等于 OxCOOOOOOO), 3GB到 4GB为 内核空间。 从前面的介绍已经看出,这两个函数所分配的内存都处于内核空间,即从 3GB- 4GB但位置不同,kmalloc()分配的内存处于3GLhigh_memory之间,这一段 内核空间与物理内存的映射 对应,而 vmalloc()分配的内存在 vmalloc_start?4GB之间,这一段连续内存区映射到物理内存也可能是非连续 的。 vmalloc()工作方式

文档评论(0)

xusheng + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档