编程的技巧与常见问题--READ.ppt
《编程的技巧与常见问题--READ.ppt》由会员分享,可在线阅读,更多相关《编程的技巧与常见问题--READ.ppt(44页珍藏版)》请在沃文网上搜索。
1、数据结构习题课 编程技巧与常见问题关于函数n特殊情况与边界情况n指针n内存管理n代码,从“头”说起n常见错误及解决方法n编程经验n推荐书目n关于作业关于函数n为什么要写函数?q实现一个逻辑意义上的独立功能n清晰、完整、独立q减少重复代码n代码重复3次以上应该写成函数n例子:有理数格式化打印输出n好的函数具有的特性q通用性:可以用于解决不同问题q独立性:不依赖于上下文代码n例子:有理数格式化打印输出(输出函数的两种形式)关于函数n选择合适的参数和返回值q形参与实参n形参:函数在声明或定义时,所写出的参数定义n实参:实际调用时,传给函数的实际参数q传值参数和传址参数(值参与变参)n传值参数:q只将
2、实参的值传入函数,函数中的操作不会影响实参本身n传址参数:q将实参本身地址传入函数,函数中的操作会影响实参关于函数n选择合适的参数和返回值q传值参数和传址参数(值参与变参)npascal:qprocedure proc1(m:integer;var n:integer);nVisual Basicqsub sub1(byval m as integer,n as integer)qdefault:byrefncqvoid func1(int m,int*pn);q调用:func1(m,&n);nc+qvoid func1(int m,int&n);关于函数n选择合适的参数和返回值q向函数内传递
3、的数据n传值参数(或全局变量)q函数传出或改变的数据n返回值、传址参数(或全局变量)n单个数据对象:返回值n多个数据对象:传址参数返回值(状态值等)q尽量不要使用全局变量n逻辑不清楚,容易被其他操作误改变n特殊情况:过程模型的状态变量编程技巧与常见问题n关于函数特殊情况与边界情况n指针n内存管理n代码,从“头”说起n常见错误及解决方法n编程经验n推荐书目n关于作业特殊情况与边界情况n在各种问题中普遍存在q解决问题时需要预见q特殊情况与边界情况的处理n特殊处理n给出提示信息q多做测试n测试数据考虑边界情况和特殊情况n本门课程的作业:不必故意使用错误数据来测试特殊情况与边界情况n常见边界情况q数值
4、n0q做除数时:给出错误信息q多项式的项系数为0:消去q多项式的项指数为0:6x0 6,n1q多项式系数、指数为1:1x1 xn负数q判断大小特殊情况与边界情况n常见边界情况q指针nNULLq做操作前,先判断指针是否等于NULLn第一个q无头节点时,增加或删除第一个节点q(例子:约瑟夫环问题,m=1)n最后一个:q无头节点时,删除最后一个节点q循环链表,删除最后一个节点特殊情况与边界情况n常见边界情况q字符串n字符串结尾,0n空串q文件结尾nfeof(FILE*file)编程技巧与常见问题n关于函数n特殊情况与边界情况指针n内存管理n代码,从“头”说起n常见错误及解决方法n编程经验n推荐书目n
5、关于作业指针n指针本身是一个变量q指针变量的值是一个内存地址q区分:指针变量本身和指针指向的空间nchar*pc;nmalloc与freeqpc=(char*)malloc(sizeof(char);n先分配空间:malloc(sizeof(char)n再把空间地址赋值给pc:pc=(char*)qfree释放的是指针指向的空间pc=(char*)malloc(sizeof(char);free(pc);/pc仍然指向该内存pc=NULL;/杜绝“野指针”0 x0012ff78:pc0 x00430130e0 x00430130指针n分配空间的管理qmalloc分配的空间,系统不管,自己负责v
6、oid test()int*pn=(int*)malloc(sizeof(int);q函数结束后,pn本身作为局部变量被销毁,但为pn分配的空间不会被销毁,成为“无主之地”q在函数结束之前“接管”为pn分配的空间nmake_node函数指针char c,*pc;int*pn;c=a;pc=&c;c=b;*pc=c;pc=(char*)malloc(sizeof(char);*pc=d;free(pc);pn=(int*)malloc(sizeof(int);pc=(char*)malloc(sizeof(char)*2);*pc=e;/pc0=e;*(pc+1)=f;/pc1=f;free(p
7、c);pc=NULL;0 x0012ff7c:c0 x0012ff78:pc0 x00430160a0 x0012ff7cdbec0 x004301600 x00430130f0 x0012ff74:pn0 x004301600 x004301300 x00000000编程技巧与常见问题n关于函数n特殊情况与边界情况n指针内存管理n代码,从“头”说起n常见错误及解决方法n编程经验n推荐书目n关于作业内存管理n内存分配方式q从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。q在栈上创建。在执行函数时,函数内局部变量的存储单
8、元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。q从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由我们决定使用非常灵活但问题也最多。内存管理n常见的内存错误及其对策q编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到。q内存分配未成功,却使用了它。n指针p 是函数的参数,函数的入口assert(p!=NULL)检查n用malloc 或new 来申请内存,if(p=NULL)或if(p!=N
9、ULL)检查q内存分配虽然成功,但是尚未初始化就引用它。n误以为内存的缺省初值全为零,导致引用初值错误,例如数组。q内存分配成功并且已经初始化,但操作越过了内存的边界。n循环次数搞错导致数组操作越界,数组下标“多1”或“少1”内存管理n常见的内存错误及其对策q忘记了释放内存,造成内存泄露。n每被调用一次就丢失一块内存,刚开始时系统的内存充足你看不到错误,终有一次程序突然死掉,系统出现提示:内存耗尽。n动态内存的申请与释放必须配对,程序中malloc 与free 的使用次数一定要相同。q释放了内存却继续使用它。n函数的return 注意不要返回指向栈内存的指针或者引用,因为该内存在函数体结束时被
10、自动销毁。n使用free 或delete 释放了内存后,没有将指针设置为NULL,导致产生野指针。内存管理nmalloc/free 和new/deleteqmalloc与free 是C+/C 语言的标准库函数,malloc与free 不能执行构造函数与析构函数。qnew与delete 是C+的运算符,它们都可用于申请动态内存和释放内存。new:一个能完成动态内存分配和初始化工作的运算符;delete:一个能完成清理与释放内存工作的运算符。qfree 释放new 创建的动态对象?无法执行析构函数,可能出错。qdelete 释放malloc 申请的动态内存?可读性差。qnew/delete 必须配
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
25 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编程 技巧 常见问题 READ