C语言与程序设计第16章参数数目可变的函数与库函数.ppt

C语言与程序设计第16章参数数目可变的函数与库函数.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
华中科技大学计算机学院C语言课程组 C语言与程序设计 The C Programming Language 本章内容 参数数目可变函数的定义 myprintf函数的实现 allocation库的设计 allocation库的接口定义 allocation库函数的实现 生成allocation库文件 allocation库的使用 16.1 参数数目可变的函数设计 C语言可以定义参数数目可变的函数。例如: int printf(const char *format, …); 该函数原型表示第1个参数必须为字符串,由三个点组成的省略号(…)表示其余参数可变,可以有0至多个。因此,该函数被调用时,实参可以有1至多个。 函数定义的形参表中,必须至少明确说明一个形参,在列出的最后一个形参后面用省略号(…)来表示其余参数数目可变。在调用参数数目可变的函数时,实参的数目必须大于或等于形参表中明确说明的形参数目。 16.1.1 参数数目可变函数的定义 需使用stdarg.h中定义的有关宏和类型。 va_list :为访问可变参数列表需声明该类型的对象。 va_start :该宏初始化所声明的va_list类型对象,初始化结果供宏va_arg和va_end使用。 va_arg :该宏需两个参数:va_list类型的对象和可变参数的数据类型,返回参数的值,并使va_list类型的对象指向可变参数列表中的下一个参数。 va_end :该宏需一个参数:va_list类型的对象,在完成对可变参数列表的访问之后调用,它执行必要的清除操作,使程序能够从带可变参数列表的函数中正常返回。 va_copy :C99中增加的宏,用来复制一个va_list类型的对象。 定义参数数目可变函数 例16.1 程序演示了如何定义、声明和调用参数数目可变的函数average。函数average的第1个参数是要计算平均值的数据个数。 分析:先用va_start初始化供va_arg和va_end使用的对象ap,使ap指向第一个不定参数。然后,用宏va_arg从可变参数列表中反复获取每一个不定参数的值,与变量sum相加。函数average用宏va_end完成可变参数列表的清理和维护,使得程序能够从average正常返回到函数main。最后,计算平均值并返回到函数main。 16.1.2 myprintf函数的实现 参数数目和类型都可变的函数设计实例: 例16.2 用putchar来实现函数myprintf,使其具有printf的主要功能,能够支持%c、%d、%s、%f和%lf等转换说明。 16.2 Linux下用户自定义库的设计及使用 用户自定义库函数的创建分为以下三步:① 自定义库函数接口(头文件)的定义;② 自定义库函数的实现;③ 生成库文件(静态库或动态链接库)。在不同的编译环境下,前两步是相同的,而第3步生成库文件所使用的工具和方法存在区别。 本节介绍Linux环境下自定义动态存储分配库allocation的设计及使用,自定义库函数完成向系统申请动态存储区、调整动态存储区大小和释放动态存储区的操作。 Linux系统下GNU C库函数sbrk可向操作系统请求存储空间作为进程的动态存储区。由于每次操作比较耗时,而且可供申请的空间有限,所以需要对所申请的存储空间进行管理,提高使用效率,减少申请次数。因此需另行设计动态存储分配库函数来管理动态存储空间。 16.2.1 allocation库的设计 函数malloc从已申请的存储空间中寻找大小合适的存储区返回给调用者;如果找不到足够大的存储区,那么再通过库函数sbrk向操作系统申请。 函数calloc与函数malloc的主要区别在于calloc会将返回给调用者的存储区初始化为全零; 函数realloc修改已分配动态存储区大小,尽量保留修改前存储区中数据; 函数free释放已分配的动态存储区,合并相邻的空闲存储碎片。 主要介绍函数malloc和free的设计和实现,设计思想参照了《The C Programming Language》一书相关内容,对原设计中的缺陷进行了改善。 16.2.1 allocation库的设计(续) 由于通过sbrk申请到的存储空间不一定是连续的,所以设计一种链式结构将每次用sbrk申请到的存储空间连接起来。 每块存储区中至少需要携带以下信息:本块大小、本块是否空闲以及下一块的地址。因为块的大小不同,这些信息放在块的起始位置便于访问,所以设计一个块头结构来存放这些信息。 16.2.1 allocation库的设计(续) 块头成员:指向下块的指针、本块的大小和本块空闲标志。对齐是指给数据分配存储空间时让数据不要跨越与其类型相应的一个边界。 typedef

文档评论(0)

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

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

1亿VIP精品文档

相关文档