



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
窗体顶端C和C+ 语言动态内存分配一、C语言动态内存分配 要实现动态内存的分配,除了利用含指针成员的结构体之外,还需利用C语言提供的几个标准库函数。(使用时应包含头文件“alloc.h”或“malloc.h”或“stdlib.h”) 1.malloc函数函数原型为void *malloc(unsigned int size);在内存的动态存储区中分配一块长度为size 字节的连续区域。函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“size”是一个无符号数。例如: pc=(char *) malloc (100); 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针, 把该指针赋予指针变量pc。若size超出可用空间,则返回空指针值NULL。 2.calloc 函数 函数原型为void *calloc(unsigned int num, unsigned int size)按所给数据个数和每个数据所占字节数开辟存储空间。其中num为数据个数,size为每个数据所占字节数,故开辟的总字节数为num*size。函数返回该存储区的起始地址。calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。例如: ps=(struct stu*) calloc(2,sizeof (struct stu); 其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。 3 realloc函数: 函数原型为void *realloc(void *ptr, unsigned int size) 重新定义所开辟内存空间的大小。其中ptr所指的内存空间是用前述函数已开辟的,size为新的空间大小,其值可比原来大或小。函数返回新存储区的起始地址(该地址可能与以前的地址不同)。例如p1=(float *)realloc(p1,16);将原先开辟的8个字节调整为16个字节。*动态申请的内存空间要进行手动用free()函数释放 4 free函数: 函数原型为void free(void *ptr)将以前开辟的某内存空间释放。函数原型为void free(void *ptr)其中ptr为存放待释放空间起始地址的指针变量,函数无返回值。应注意:ptr所指向的空间必须是前述函数所开辟的。例如free(void *)p1);将上例开辟的16个字节释放。可简写为free(p1);由系统自动进行类型转换。二、C+语言动态内存分配C+语言中用new和delete来动态申请和释放内存。 1. 申请单个对象int *p;p=new int;或者 p=new int(value); 2. 动态申请数组int *p;p=new int 100;这样可以申请长度为100的数组,但是不能进行初始化。3. deleteint *p, *q;p=new int;q=new int10;delete p;delete q;欢迎zdx_mail我的:资源博客空间简历设置|帮助|退出 CSDN首页 资讯 论坛 博客 下载 搜索 更多zhq_yang的专栏 目录视图 摘要视图 订阅2011年度CSDN高校俱乐部“优秀主席”火热出炉!点击了解英特尔云计算2012年1月当选微软MVP的CSDN会员名单揭晓!adi blackfin dsp处理器中的多堆(Multiple Heaps)技术分类:blackfin DSP2008-07-15 15:01111人阅读评论(0)收藏举报Introduction在嵌入式软件开发中,一般不建议使用动态内存分配。一个主要的原因就是嵌入式系统的资源十分有限,动态内存分配很容易导致系统运行异常。具体地讲, 在blackfin dsp系统中,默认的堆空间在L1 memory中,而L1空间是很有限的,如BF533处理器,其L1中的DATA空间只有64K。然而,不使用动态内存分配,使得代码有时看起来会比较奇 怪,维护起来很不方便。本文介绍adi blackfin dsp处理器提供的多堆技术,使用者除了使用系统默认的堆空间外,还可以自己建立堆空间,自由指定堆的大小和空间,动态内存从自己建立的堆空间中分配。blackfin c/c+ 运行时库(run-time library)标准的堆管理函数:calloc, free, malloc, 和relloc。系统运行时,默认只有一个堆。用户可以定义多个堆,这些扩展的堆管理函数为heap_calloc, heap_free, heap_malloc and heap_realloc。多堆技术使得用户可以在fast-but-scarce memory(即L1或L2)中定义堆,也可以在slower-but-plentiful memory (SDRAM)中定义堆。定义堆堆可以在链接时或运行时定义。不管是何种方式,都需要指定堆的三种特征: 起始地址(最低可用的地址); 长度(字节); 标记(userid,=1);系统默认堆,在链接时指定,userid是0。 另外,堆还有一个属性叫做索引(indices),indices与userid类似,不同之处在于它是系统定义的。在使用自定义堆时,必须使用 indices而不是userid。用户可以调用函数_heap_lookup() 进行userid到indices的转换。在链接时定义堆链接时定义的堆在heaptab.s文件中定义,堆的起始地址、长度和userid用32位字表示。各个堆定义在一个称之为“_heap_table”的 表中。这个表必须首先包含默认堆(userid为0),必须以一个入口地址为0的项目结束。 表中的地址可以是真实的地址值(如002000000),也可以使在ldf文件中定义的符号。默认堆必须使用ldf中定义的符号。 “ _heap_table ”表存在于constant存储空间中,当第一次对某个堆进行请求时,它被用来运行时初始化堆结构_heaps,并设置_nheaps作为可使用 堆的编号。 注意:堆的数量是有上限的,即MAXHEAPS ,在heapinfo.h中定义。目前这个值是4,即最多允许4个链接时堆。同样,这里指定的堆的编号要用_heap_lookup()函数得到系统辨识 的indices,这个函数原型是: int _heap_lookup(int userid); / returns index在运行时定义堆可以用_heap_install() 函数在系统运行时定义堆:int _heap_install(void *base, size_t length, int userid); 这个函数可以使用任意一个存储块的地址作为堆的起始地址。它返回的是indices,也就是说不必再调用_heap_lookup()函数来进行转换。如果返回值小于0,则说明出错。出错原因可能是: 在_heaps表中没有足够的空间; 指定的userid已经存在; 指定的堆太小了;tips 堆的起始地址不能是000000000,这个地址是为NULL指针保留的。 堆中不是所有空间都可用来作内存分配用。有一部分是为housekeeping保留的。 堆的起始地址必须是8字节对齐。 堆的长度必须是2的整数次方,如256,512,1024字节。标准堆操作接口标准的堆操作函数,如malloc和relloc,总是在默认堆中分配内存。而space_unused函数返回默认堆中剩余可用的空间大小。由于有内存碎片,可能不能分配所有可用的空间。扩展的堆操作接口C运行时库提供了扩展的堆接口函数,用于自定义的堆操作。这些函数是:heap_calloc, heap_free, heap_malloc, and heap_realloc。这些函数的用法和标准函数类似,只是需要指定操作的堆索引(index)。 void *_heap_calloc(int idx, size_t nelem, size_t elsize) void *_heap_free(int idx, void *) void *_heap_malloc(int idx, size_t length) void *_heap_realloc(int idx, void *, size_t length)heap_realloc(idx, NULL, length) 等效于heap_malloc(idx, length) 。 而对于heap_realloc(idx, ptr, length) 如果ptr != NULL, 则提供了idx参数将会被无视;reallocation总是在原来分配的堆上进行。 类似的heap_free(idx, ptr) 也对idx参数无视。heap_space_unused(int idx) 返回idx指定的堆空间的可用字节数。返回-1表示idx无效。C+扩展接口C+运行时库提供了new和delete的扩展接口。 C+中堆的定义和初始化和C描述的一样。这些堆还可以被new和delete使用。所需的操作仅仅是告诉new和delete要针对哪个堆进行操作。同样,不必要告诉delete操作的堆index。例:#includechar *alloc_string(int size, int heapID)cha
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿国学礼仪培训
- 幼儿教育经验分享
- 北森面试官培训
- 小动物内科病例诊疗分析
- 隐患辨识训练培训课件
- 关注学生兴趣培养激发学习动力
- 建筑课堂考试题及答案
- 全新肺结核病人的护理
- 家具品质考试题及答案
- 会议正式流程
- 《基础护理学》第七版考试题库大全-上部分(600题)
- 2025年日历( 每2个月一张打印版)
- 福建省厦门市2023-2024学年高二下学期期末质量检测数学试题
- 大班幼儿自主建构游戏:搭鸡窝 课件
- 信息检索智慧树知到答案章节测试2023年齐鲁工业大学
- 铝镁锰金属屋面专项施工组织设计
- 搅拌器的型式
- 传感器原理 磁电式传感器
- XX印务有限公司采购控制程序
- 2.沟槽开挖(检验批)质量验收记录表
- GB/T 8433-1998纺织品色牢度试验耐氯化水色牢度(游泳池水)
评论
0/150
提交评论