当前位置: 首页 > news >正文

【指针有效性】指针有效性的有效性检测的必要性!!

题目:

已知strcpy函数的原型是:

char * strcpy(char * strDest,const char * strSrc);

1.不调用库函数,实现strcpy函数。

2.解释为什么要返回char *。

解说:

1.strcpy的实现代码

char * strcpy(char * strDest,const char * strSrc)

{

char * strDestCopy=strDest; //[3]

if ((strDest==NULL)||(strSrc==NULL)) //[1]

throw "Invalid argument(s)"; //[2]

while ((*strDest++=*strSrc++)!='\0'); //[4]

return strDest;

}

错误的做法:

[1]

(A)不检查指针的有效性,说明答题者不注重代码的健壮性。

  (B)检查指针的有效性时使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识。在本例中char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C++专门增加了bool、true、false三个关键字以提供更安全的条件表达式。

(C)检查指针的有效性时使用((strDest==0)||(strSrc==0)),说明答题者不知道使用常量的好处。直接使用字面常量(如本例中的0)会减少程序的可维护性。0虽然简单,但程序中可能出现很多处对指针的检查,万一出现笔误,编译器不能发现,生成的程序内含逻辑错误,很难排除。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。

例子来源:http://baike.baidu.com/view/1026861.htm

指针有效性的有效性检测的必要性!!

•指针的危险
   long *fellow;

  *fellow=22322;

  fellow确实是一个指针,但它指向哪里呢?上述代码没有将地址赋给fellow,那么22322将被放哪,我们并不知道。由于fellow没有被初始化,它可能 有任何值。不管值是什么,程序都将它解释为存储
22322的地址。如果fellow的值碰巧为0060,计算机将把数据放在地址0060上,即使这个地址恰巧是程序代码所在的地址,这种错误可能会导致一些最隐匿、最难以跟踪的bug。解决办法:一定要在对指针应用*运算符之前,将指针初始化为一个确定的、适当的地址。这是使用指针的金科玉律。


所以指针有效性的检测的意义在于,不会将指针初始化在一个 程序代码所在的地方,避免了指针给程序所在的地方赋值造成程序的buge。

相关文章:

  • 【GPRS透明传输】GPRS透明传输
  • 【GPRS拨号错误】GPRS 某条指令一直ERRO
  • 【IAR编译和单片机】IAR编译和单片机的一些积累
  • 【C++】C++获取系统日期时间
  • 【单片机重启】MSP430重启/频繁重启/跑飞 原因分析
  • 【堆和栈的区别】堆heap 和栈stack有什么区别(代码区、常量区、静态区(全局区)、堆区、栈区)...
  • 【MODBUS】 协议
  • 【单机片调试】开发调试MSP430 遇到的问题总结
  • 【单片机程序和RAM】程序在RAM中调试的运行方式程序固化后运行方式
  • 【关于单片机的N多问题】关于单片机的N多问题
  • 【volatile关键字】 详解C中volatile关键字(IAR 优化等级问题)
  • 【下载进去无法运行】MSP430 程序能下载进去却无法运行
  • 【文章收藏】文章收藏
  • 【DATA16DATA20】MSP430中的DATA16和DATA20【Data model Large】
  • 【编程经验总结】编程经验总结
  • JavaScript-如何实现克隆(clone)函数
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • Apache的80端口被占用以及访问时报错403
  • create-react-app项目添加less配置
  • gf框架之分页模块(五) - 自定义分页
  • Gradle 5.0 正式版发布
  • JavaScript 奇技淫巧
  • js作用域和this的理解
  • python_bomb----数据类型总结
  • spring boot 整合mybatis 无法输出sql的问题
  • 爱情 北京女病人
  • 动态规划入门(以爬楼梯为例)
  • 服务器之间,相同帐号,实现免密钥登录
  • 高性能JavaScript阅读简记(三)
  • 记一次和乔布斯合作最难忘的经历
  • 嵌入式文件系统
  • 如何编写一个可升级的智能合约
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 我这样减少了26.5M Java内存!
  • 小李飞刀:SQL题目刷起来!
  • 学习ES6 变量的解构赋值
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (4) PIVOT 和 UPIVOT 的使用
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • .bat批处理(一):@echo off
  • .Net Redis的秒杀Dome和异步执行
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .net网站发布-允许更新此预编译站点
  • @JSONField或@JsonProperty注解使用
  • [1204 寻找子串位置] 解题报告
  • [BZOJ1008][HNOI2008]越狱
  • [C# 基础知识系列]专题十六:Linq介绍
  • [C#]winform部署yolov9的onnx模型
  • [C#C++]类CLASS