C语言中的缺陷与陷阱.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言中的缺陷与陷阱

C语言中的缺陷与陷阱 (博雅课期末作业:计算机网络安全与防护) 刚进大学,学的第一门计算机语言就是C语言,这是我第一次接触到计算机语言,对它一无所知。有些同学之前已经学过了一些类似的语言,例如VB、PASCAL等等。因为从来没有学过计算机语言,所以在学习C语言的过程中,遇到了很多困难,许多问题都不理解。因此虽然我已经学完了这本书,但是对书中的内容都不知甚解。 学过C语言的人都知道,指针是C语言中的一个重要概念,也是它的一个重要特色。正确而灵活地运用指针,可以有效地表示复杂的数据结构;能动态分配内存;方便地使用字符串;有效而方便地使用数组;在调用函数时能获得一个以上的结果;能直接处理内存单元地址等。掌握指针的应用,可以使程序简洁、紧凑、高效。但是任何事情都有两面性,C语言中的指针也是如此。举几个例子来说: 指针与数组 在新的一年里我们需要将日历(calendar)数组清空: int (*monthp)[31]; for(monthp=calendar;monthpcalendar[12];monthp++) { int *dayp; for(dayp=*monthp;daypmonthp[31];dayp++) *dayp=0; } 在这个程序中用指针monthp以步进的方式遍历数组calendar。使用指针来操纵数组,常常需要跟C语言中最为“晦暗不明”的部分打交道,并常常遭遇到潜伏着的编译器bug。因此使用指针时,我们必须得小心翼翼,否则,程序很容易出错。 非数组的指针 有一段程序如下: char *r,*malloc(); r=mollac(strlen(s)+strlen(t)); strcpy(r,s); strcat(r,t); 这个例子有三个错误:一、malloc函数有可能无法提供请求的内存,这种情况下malloc函数会通过返回一个空指针来作为“内存分配失败”事件的信号。二、给r分配的内存在使用完成之后应该立即释放。三、最重要的是调用malloc函数是并未分配足够的内存。 数组边界问题 C语言并不检验数组边界,因此,数组的两端都有可能越界而使其他变量的数据甚至程序代码被破坏。因此对于C语言来说,数组的边界检验是程序员的职责。 C语言中一个拥有n个元素的数组中,却不存在下标为n的的元素,它的元素的下标范围是从0到n-1,使用数组时一定要注意到这一点。 表达式求值顺序 一个表达式:abcd,C语言规定ab首先被求值。如果a确实小于b,cd必须紧接着被求值以计算整个表达式的值。但如果a大于或等于b,则cd根本不会被求值。 ??? C中只有四个运算符、||、?:和,指定了求值顺序。和||最先对左边的操作数进行求值,而右边的操作数只有在需要的时候才进行求值。而?:运算符中的三个操作数:a、b和c,最先对a进行求值,之后仅对b或c中的一个进行求值,这取决于a的值。,运算符首先对左边的操作数进行求值,然后抛弃它的值,对右边的操作数进行求值。 C中所有其它的运算符对操作数的求值顺序都是未定义的。事实上,赋值运算符不对求值顺序做出任何保证。 移位运算符 C语言中,在向右移位时如果被移位的对象是无符号数,那么空出的位将被0填充。如果被移位的对象是有符号数,那么C语言实现既可以用0填充空出的位,也可以由符号位的副本来填充空出的位。 移位计数也有一定的范围限制。如果被移位的对象长度是n位,那么移位计数必须大于或等于0,而严格小于n。因此,不可能做到在单次操作中将某个数值中的所有位都移出。 还要注意的是,即使C语言实现将符号位复制到空出的位中,有符号整数的向右移位运算也不等同于除以2的某次幂。 可移植性缺陷 C被很多人实现并运行在很多机器上。这也正是在一个地方写的C程序应该能够很容易地转移到另一个编程环境中去的原因。 然而,由于有很多的实现者,它们并不和其他人交流。此外,不同的系统有不同的需求,因此一台机器上的C实现和另一台上的多少会有些不同。 由于很多早期的C实现都关系到UNIX操作系统,因此这些函数的性质都是专于该系统的。当一些人开始在其他系统中实现C时,他们尝试使库的行为类似于UNIX系统中的行为。 但他们并不总是能够成功。更有甚者,很多人从UNIX系统的不同版本入手,一些库函数的本质不可避免地发生分歧。今天,一个C程序员如果想写出对于不同环境中的用户都有用的程序就必须知道很多这些细微的差别。 为了减少程序的错误,我们可以采取以下一些建议: 不要说服自己相信潜在的错误。有些错误极具伪装性和欺骗性。 直截了当的表明意图,这样做不仅有利于自己日后读程序,也方便其他人理解程序的用意和维护代码。 考察最简单的特例。这一原则适用于构思程序的工作方式,测试程序的工作情况和程序设计 使用

文档评论(0)

178****9325 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档